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の文字エンコード処理が最悪
    • Encode::EUCJP1998 とかいう今はなきライブラリを要求してくる
  • WWW::Curl::Easyでは,文字コードが取ってこれない
    • HTTP header の Content-Type が取れればいいけど,HTTP headerすべてしか取れない
      • HTTP::Messageでパースする(そのときHTTPステータス行があるとエラーになるので削除)
    • HTMLのmetaにある文字コードは,HTML::HeadParserで取得
      • だが,昔のContent-Typeを指定するmetaからは取得できないので,別途対応

とにかく最悪な感じですわ.もっと文字コード簡単に取ってくるいい方法ないですかね.


さて,WWW::Curl::Easyにこだわらなければ,もっと楽に書ける.

LWP::UserAgentを使えばいい.decoded_contentを使えば勝手にエンコードされる.

ふつうにLWP::UserAgent使えよって話ですよね,はい...


追伸

HTML5に対応するならさ,文字コードUTF-8にするぐらいしたらいいのにさ.

UTF-8だったら,こんなに困らないし.