PerlでHTML5をパースするお話
高校3年の冬,ちょうど今頃.
2年前の話だが,受験最悪だったから家にあったRasPiでWebクローラを作った.
そのときに出会ったのがPerl.それ以来,さほどPerl触っていないので,実は初心者ちょっと脱したぐらいの知識しかない.
過去に書いたコードもちょっと直したいなぁって思ったんで,久しぶりに組み直してみた.
HTML5が普及し始めて,今まで使えていたパーサが使えなかったりしたのでそのへんも調整.
とりあえず先に結論.
LWP::UserAgent + HTML::HTML5::Parser + XML::LibXML::QuerySelector がよさげ.
HTML::HTML5::Parser は,HTML5のパースに必要.
XML::LibXML::QuerySelector は,JavascriptのquerySelectorのように書ける.
Javascriptを普段書いている人なら,この方がわかりやすいと思う.
以下,雑記.
以前,とあるバイトでWebクローラを書くことになって,速度が必要だった.
そこで出会ったのが,WWW::Curl::Easy.
それからというもの,とにかくWWW::Curl::Easyを使うようになった.
なんせ速いから.
だけど,今回ばかりはちょっと失敗だったような気がする.
とりあえず作ったコード載せる.
まず,色々最悪なことを綴る.
- HTML::HTML5::Parserの文字エンコード処理が最悪
- WWW::Curl::Easyでは,文字コードが取ってこれない
- HTTP header の Content-Type が取れればいいけど,HTTP headerすべてしか取れない
- HTTP::Messageでパースする(そのときHTTPステータス行があるとエラーになるので削除)
- HTMLのmetaにある文字コードは,HTML::HeadParserで取得
- だが,昔のContent-Typeを指定するmetaからは取得できないので,別途対応
- HTTP header の Content-Type が取れればいいけど,HTTP headerすべてしか取れない
とにかく最悪な感じですわ.もっと文字コード簡単に取ってくるいい方法ないですかね.
さて,WWW::Curl::Easyにこだわらなければ,もっと楽に書ける.
LWP::UserAgentを使えばいい.decoded_contentを使えば勝手にエンコードされる.
ふつうにLWP::UserAgent使えよって話ですよね,はい...
追伸
HTML5に対応するならさ,文字コードUTF-8にするぐらいしたらいいのにさ.
UTF-8だったら,こんなに困らないし.