全長DR

全長DR

HTMLページを解析しようとしています。子犬。これは通常のHTMLセレクタを許可するコマンドラインHTMLパーサです。私のコンピュータにすでにインストールされているPythonを使用できることを知っていますが、pupを使用してコマンドラインを練習する方法を学びたいと思います。

クロールしたいウェブサイトは次のとおりです。 https://ucr.fbi.gov/crime-in-the-us/2018/crime-in-the-us-2018/topic-pages/tables/table-1

HTMLファイルを作成しました。

curl https://ucr.fbi.gov/crime-in-the-u.s/2018/crime-in-the-u.s.-2018/topic-pages/tables/table-1 > fbi2018.html

「人口」などのデータ列を抽出するにはどうすればよいですか?

これは私が最初に書いたコマンドです。

cat fbi2018.html | grep -A1 'cell31 ' | grep -v 'cell31 ' | sed 's/text-align: right;//' | sed 's/<[/]td>//' | sed 's/--//' | sed '/^[[:space:]]*$/d' | sort -nk1,1 

うまくいきますが、醜くてハッキング的なアプローチなので、pupを使いたいです。 「人口」列に必要なすべての値がラベルのheaders="cell 31 .."どこかにあることを確認しました<td>。たとえば、

<td id="cell211" class="odd group1 valignmentbottom numbercell" rowspan="1" colspan="1" headers="cell31 cell210">
323,405,935</td>

タグにこの特定のヘッダーを含むすべての値を抽出したいと思います<td>。この特定の例では、次のようになります。323,405,935

しかし、犬の複数のセレクタが機能していないようです。これまで、すべてのtd要素を選択できます。

cat fbi2018.html | pup 'td'

しかし、特定のクエリを含むヘッダーを選択する方法がわかりません。

編集する: 出力は次のようになります。

272,690,813
281,421,906
285,317,559
287,973,924
290,788,976
293,656,842
296,507,061
299,398,484
301,621,157
304,059,724
307,006,550
309,330,219
311,587,816
313,873,685
316,497,531
318,907,401
320,896,618
323,405,935
325,147,121
327,167,434

答え1

全長DR

テーブルの「人口」の下に列全体を表示するには、次のオプションを使用します。

... | pup 'div#table-data-container:nth-of-type(3) td.group1 text{}'

基本的な使い方

pup実際には、マルチセレクタがサポートされています。たとえば、wanted text!!次のコンテンツをクロールする場合:

$ cat file.html
<div>
  <table>
    <tr class='class-a'>
       <td id='aaa'> some text </td>
       <td id='bbb'> some other text. </td>
    </tr>
    <tr class='class-b'>
       <td id='aaa'> wanted text!! </td>
       <td id='bbb'> some other text. </td>
    </tr>
  </table>
</div>

$ cat file.html | pup 'div table tr.class-b td#aaa'
<td id="aaa">
 wanted text!!
</td>

次に、追加してtext{}テキストのみを取得します。

$ cat file.html | pup 'div table tr.class-b td#aaa text{}'
 wanted text!!

したがって、お客様の場合は、次のようにする必要があります。

$ cat fbi2018.html | pup 'td#cell211 text{}'

323,405,935

または、より良い方法は、ページをダウンロードする必要なしにパイプでのみ接続するcurlことです。pup

url="https://ucr.fbi.gov/crime-in-the-u.s/2018/crime-in-the-u.s.-2018/topic-pages/tables/table-1"
curl -s "$url" | pup 'td#cell211 text{}'

説明する

列全体から値を取得するには、インポートする要素の特性を知る必要があります。

この場合、そのリンクの「人口」列です。ページには2つのテーブルが含まれています。<div id='table-data-container'>...を使用すると、... | pup 'div#table-data-container'2番目のテーブルからデータを取得します。あなたはこれをしたくありません。

テーブル

pup最初のテーブルが欲しいとどうすればわかりますか?まあ、ここに別のヒントがあります。ご覧のとおり、sがほとんどありません<div>。あなたのテーブルは3番目のスペースにあります。だからあなたは使用することができますCSS擬似クラス、この場合div#table-data-container:nth-of-type(3)

次に、列には次のユニークなセレクタがあります。td.group1

セレクタ

すべて結合し、パイプを使用してgrep -v -e '^$'スペースを削除します。

... | pup 'div#table-data-container:nth-of-type(3) td.group1 text{}' | grep -v -e '^$'

あなたはあなたが望むものを得るでしょう:

272,690,813
281,421,906
285,317,559
...
327,167,434

答え2

これには2つの問題があります。
1) HTML テーブルの値を解析します。
2)必要な作業(最小、最大など)を実行します。

私はあなたが1行でこれを達成できるとは思わない。 HTMLテーブルを.csvに変換し、CSVで作業するアイデアが気に入っています。 AWKを使用できますが、私はPythonライブラリPandasを使用します。 bashを避けることができれば、なぜ書くのですか?

bashを使ってHTMLテーブルを.csvに変換する方法を見つけました。ここ

AWKを使用した熱平均化の例は次のとおりです。ここ

関連情報