- blogs:
- cles::blog

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



新サーバに移行をしたらcronに仕込んであるmixi2gmailがうまく動かなくなってしまいました。
同じスクリプトを旧サーバで実行すると正常に動作するので、何か環境に依存した問題なんだろうと思って、詳しく調べてみると
という部分で続きを読むがうまく見つけられていないようだったので、おそらく文字コードの問題だろうということで、文字コードを変えてみたりといろいろ試行錯誤をしていたのですが、ふとエラーを吐いているのがいつもの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が必要です→https://blog.cles.jp/item/2870
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
mechanizeをアップデートしたら、今までバッチで動かしてたスクリプトがエラーになってて、今頃気づいてキーってなってたとこです。
NikogoriからHpricotに切り替えてしまえば良いのですね!
助かります!
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110776)
3 . 年次の人間ドックへ(110371)
4 . 2023 年分の確定申告完了!(1つめ)(109917)
5 . 三菱鉛筆がラミーを買収(109817)