- blogs:
- cles::blog
2010/02/11

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



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 を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . アーロンチェアのポスチャーフィットを修理(112084)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110718)
3 . 年次の人間ドックへ(110329)
4 . 2023 年分の確定申告完了!(1つめ)(109876)
5 . 三菱鉛筆がラミーを買収(109784)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110718)
3 . 年次の人間ドックへ(110329)
4 . 2023 年分の確定申告完了!(1つめ)(109876)
5 . 三菱鉛筆がラミーを買収(109784)
cles::blogについて
Referrers