pupを使ってコンソール上でスクレイピングする

curlとかwgetとか使っているといっそコンソール上でスクレイピングしたくなることがよくあります。

自分でパーサを書くのも面倒だし何かないかなと探していたらpupなるものを見つけました。

動作

標準入力 or ファイルの内容をCSS Selectorで検索、抽出し、標準出力に表示します。

つまり、パイプを通し放題なわけです。便利ですね。

出力形式は

  • HTML
  • テキスト
  • json

のうちどれか一つを指定することが出来ます。また、あるElementのあるAttributeの値だけを出力、なんてことも出来ます。

勿論、pupで出力した結果をパイプしてgrepしたりtrして更に加工してもいいでしょう。pupの結果をpupにパイプしたりしてもいいと思います。

インストール

Release Pageコンパイル済みの実行ファイルが置いてあります。

Go言語の環境がインストールされていればgo getで、Mac使ってるならbrewでもいいみたいです。

使い方

GitHubQuick StartExampleを見ておけば十分です。

出力形式の指定

Display Functionsと言うセクションに書いてあります。

  • text{} - 抽出したElementのテキスト
  • attr{attrkey} - 抽出したElementのattributeの値
  • json{} - 抽出したElementのjson

指定しなければHTML形式のまま出力されます。

attr{attrkey}を上手く活用すればXMLのパースもそこそこ容易に可能なので、コンソール上で動くRSSリーダーなんかも作れたりします。

オプション

オプション 省略形 動作
—color -c 出力結果を色付きで表示してくれる。
—file filePath -f filePathに指定したファイルを使用する。
—help -h ヘルプを表示する。
—indent count -i countに指定した数値の数だけインデントする。(html、jsonのみで有効)
指定しないとデフォルトのインデントが入る。
—number -n 出力された結果の番号を表示してくれる…らしいのだが、指定すると「そんなオプションはない」と怒られる。
ソースを見てみると確かにない。何だこれ。
—limit level -l level以上の要素を「…」として表示します。いっそ表示してくれないほうがありがたいんだが。
textも1レベルとしてカウントするので注意。
—charset charset N/A UTF-8EUC-JP以外のものを読み込ませる時に使うのだと思われるが、どんな値が指定できるのかよくわからない。
内部ではcharset.Lookupにそのまま値を渡しているが、これまたどんな値が指定できるのかよくわからない。
試しに「Shift-JIS」を渡したら上手く行ったので、常識の範囲内で指定してあげて下さい。
—version N/A バージョンを表示します。

まとめ

そんなわけで、pupを入れればちょっとしたスクレイピングならコンソールだけで簡単に出来てしまいます。

一々何らかの言語でパースしてた人は試してみてはいかがでしょうか。