[ruby]Mechanizeでencoding error : input conversion failed due to input error が発生


[まとめ] 現在開催中のKindleセール情報はこちら

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)

    # これまで通りの加工処理

応急処置ですが、また同じことが起きた際に忘れてそうなのでメモ。

文字コードはハマるとなかなか大変ですね。

参考

[まとめ] 現在開催中のKindleセール情報はこちら