2020年にもなって何故か Shift_JIS のページをスクレイピングしようとしているのだが、その際以下のようなエンコーディングに関するエラーが出てしまった。
rake aborted!
Encoding::UndefinedConversionError: "\xFC\x81" from Windows-31J to UTF-8
該当のソースコードは以下のような感じ。Faraday で URL から HTML を取得しているだけだ。
url = 'https://example.com/index.html'
response = Faraday.get(url)
html = response.body.encode('UTF-8', 'Windows-31J')
UndefinedConversion という文字列から察するに変換しようにも対象の文字が UTF-8 に存在しなくてエラーが出るということだろう。そういう場合には encode メソッドのオプションを利用して invalid や undefined な文字が含まれていた場合の処理を記述しておくと例外が発生するのを回避できる。
String#encode (Ruby 2.7.0 リファレンスマニュアル)以下のような感じ。
response = Faraday.get(url)
html = response.body.encode('UTF-8', 'Windows-31J', {
:invalid => :replace,
:undef => :replace,
:replace => ' ',
})
こうしておくと変換できない文字は空白になる。
Sponsored Link