BLOGTIMES
2009/01/03

Mechanize0.9.0でスクレイピングがうまくいかないときは

  ruby  scrape  charset 
このエントリーをはてなブックマークに追加

新サーバに移行をしたらcronに仕込んであるmixi2gmailがうまく動かなくなってしまいました。

同じスクリプトを旧サーバで実行すると正常に動作するので、何か環境に依存した問題なんだろうと思って、詳しく調べてみると

/続きを読む/ =~ link.node.inner_html

という部分で続きを読むがうまく見つけられていないようだったので、おそらく文字コードの問題だろうということで、文字コードを変えてみたりといろいろ試行錯誤をしていたのですが、ふとエラーを吐いているのがいつものHpricotではなくて、見慣れないNokogiriであることに気づきました。

ということで、ググってみるとMechanizehは0.9.0からHTMLパーサーがHpricotからNokogiriに変更されていて、日本語を検索するようなスクリプトを書いている場合には、この仕様変更による副作用があるというのが結論のようです。

RubyのMechanize0.9.0&Nokogiriは日本語をうまく扱えないことがある - きたももんががきたん。

なお、「NokogiriはHpricotと互換」と謡われていますが、実はこの文字エンコードの扱いの部分が違います。

Hpricot
文字エンコードは不変で出力は素通し
Nokogiri
文字エンコードは入力が UTF-32/16/8 か ASCII を期待、出力は UTF-8 に強制的に変換

これまでNokogiriは使ったことがなかったのでよく知りませんでしたが、このあたりは覚えておいた方が良さそうです。

Mechanize 0.9でHpricotを使う方法

Mechanize 0.9以降でHpricotを使には以下のようにすればいいようです。
僕の場合はmixi2gmailがこれでばっちり動くようになりました。

RubyのWWW::Mechanize が 0.9.0 に - きたももんががきたん。

Nokogiri を使わない場合は、明示的に
require 'hpricot' WWW::Mechanize.html_parser = Hpricot agent = WWW::Mechanize.new ...

と書きます。

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/2870
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    matane (2009/05/30 07:57) <%HatenaAuth()%>

    mechanizeをアップデートしたら、今までバッチで動かしてたスクリプトがエラーになってて、今頃気づいてキーってなってたとこです。

    NikogoriからHpricotに切り替えてしまえば良いのですね!

    助かります!

    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン