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