[ruby]Mechanizeでencoding error : input conversion failed due to input error が発生
Mechanizeで古いサイトのスクレイピングを行った際に、
encoding error : input conversion failed due to input error, bytes 0xAD 0xA1 0x2E 0x26
というエラーが発生しました。
調べてみると①といった丸数字でエラーが発生しているようです。
ページのエンコードはEUC-JPだったのですが、丸数字はEUC-JP-MSに該当するようです。
参考サイトに記載されていた、
agent.page.encoding = "eucJP-MS"
を指定して試してみたところ、エラーは出なくなったもののうまくいかず。
さらに調べてみると、そもそもMechanizeで読み込んだNokogiriのオブジェクト自体がエラー箇所以降で取得できていませんでした。
そこで、一旦ローカルにhtmlファイルをダウンロードしてきてUTF8で保存して試したところ、うまくデータを抽出することができました。
# webから取得は一旦コメントアウト
#top = @agent.get(URL)
#@agent.page.encoding = "cucJP-MS" # 文字化け防止
# 丸数字でエラーになったので一度ローカルにhtmlをダウンロードして対応する
file = File.open('./sample.html', 'rb'){|f| f.read}
uri = URI.parse('http://localhost/')
response_header = {'content-type'=>'text/html'}
response_status = '200'
top = Mechanize::Page.new(uri, response_header, file, response_status, @agent)
# これまで通りの加工処理
応急処置ですが、また同じことが起きた際に忘れてそうなのでメモ。
文字コードはハマるとなかなか大変ですね。
参考
- [■[Ruby] Mechanize + Nokogiri の非JIS文字対応](http://d.hatena.ne.jp/otn/20091124/p1)
- RubyのMechanizeでローカルのファイルを読み込む++(8/31)
- CP932など特殊な文字を含むHTMLをスクレイピングする