hello-world
webエンジニアのメモ。とりあえずやってみる。

[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)

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

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

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

参考


Related #Ruby

[Rails]find_or_create_byとfind_or_initialize_by

Rails4で確認。

capistranoで世代管理する際の注意点

最近、デプロイツールに capistranoを使っているのですが、世代管理の設定を勘違いしていたのでメモを残しておきます。

[rails]unicornでpryを使う

先日、pryでデバッグする という記事を書きましたが、こちらはrails server(フォアグランド)でアプリを立ち上げた際のデバッグ方法でした。