BLOGTIMES
2010/02/11

MechanizeでUTF-8以外のページをスクレイピングするときの文字化け対策

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

RubyのMechanizeはスクレイピングをするときにとても便利なライブラリですが、UTF-8以外のページだとどうしてもうまく取得出来ないページがあって困っていたのですが、「Mechanize Nokogiri の非JIS文字対応 - それはそれ。これはこれ。」というエントリを参考にworkaroundを追加してなんとか回避することに成功したのでメモ。

require 'rubygems' require 'mechanize' require 'nkf' agent = WWW::Mechanize.new agent.user_agent_alias = "Windows IE 7" # workaround agent.post_connect_hooks << Proc.new do |params| if %r|text| =~ params[:response]["Content-Type"] params[:response_body] = NKF.nkf("-wm0",params[:response_body]) params[:response_body].gsub(/<meta[^>]*>/) do |meta| meta.sub(/Shift_JIS|SJIS|EUC-JP/i,"UTF-8") end params[:response]["Content-Type"]="text/html; charset=utf-8" end end agent.get("http://example.jp/")

ほとんど参考にしたエントリそのままですが、共通のルーチンでいろんなエンコードに対応させたかったので、NKFの引数から入力エンコーディングの指定を取り去ったり、metaタグ内の"Content-Typeのエンコーディングの書き換えについてはちょっと手を入れています。

フックをつかってパーサーに渡る前の文字列のエンコーディングをあらかじめ変更しておいてあげるというなかなかの力業ですが、Nokogiri内の処理が信頼できない以上、それもいたしかたないですね。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3416
    Trackbacks
    Mechanizeを使ってスクレイプしてるとUTF-8以外のページでうまくいかないことがあるので、その対策です。 http://blog.cles.jp/item/3416 からほとんどまるまるコピペなんですけど、2.0.1だと引数が変わってるみたいだったので対応しました。 Mechanizeをnewしたあとにhook
    働かないプログラマのメモ帳 (2011/07/31 08:08)
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

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

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

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