Mechanizeでエンコーディングの推測に失敗するとき
Shift-JISのページをMechanizeでスクレイピングしようとしたら、日本語が上手く扱えてなくてちょっとはまった。
文字列の中身としてはShift-JISのバイト列っぽいのだけど、エンコーディングはUTF-8なものが取れてきてしまう。
HTMLのmetaタグでcharsetが指定されてなくて、エンコーディングの推定に失敗している?
agent = Mechanize.new agent.get(url) text = agent.page.at('div[...]/span[...]').inner_text puts text.encoding # => UTF-8 puts text # => ŠG–{E’n–
Ruby1.9で導入された外部エンコーディングを指定するとよいのかなと思ったけど違った。
Mechanizeはそのへん関係ないらしい。
pageオブジェクトのencodingを適切に指定するとうまくいった。
http://w.livedoor.jp/ruby_mechanize/d/Mechanize%3a%3aPage#encoding=
agent = Mechanize.new agent.get(url) agent.page.encoding = 'Shift_JIS' # この行を追加 text = agent.page.at('div[...]/span[...]').inner_text puts text # => 絵本・地獄