Ruby "no implicit conversion of Hash into String (TypeError)" BOM付きファイルを読み込んだ時に起きるエラー

require 'open-uri'
require 'nokogiri'

UserAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36'

File.open("scraping_hotels7.csv"){|f|
  f.each do |url|
    url.chomp!
    doc = Nokogiri::HTML(open(url,'User-Agent' => UserAgent))
    puts doc
    sleep 1
  end
}
/Users/user_name/.rbenv/versions/2.1.4/lib/ruby/2.1.0/open-uri.rb:36:in `initialize': no implicit conversion of Hash into String (TypeError)

エラー内容を確認してみる。

TypeError

文字列であるべきところにハッシュが入っているよーとのこと。

Nokogiriで解析するために集めたURLをリスト化したCSVを開いているが、ゴミがありそうな項目はない。 いろいろと調べていると、CSVを作成する際に文字化けせずにExcelでも開けるようにBOMを入れた事を思い出す。

Excel(エクセル)で文字化けしないUTF-8のCSVファイルを出力する方法

BOMが付いていない場合は、シフトJISと解釈して開いてしまうようで、そのため文字化けします。

BOMはfile コマンドを使って調べることができる。

$ file scraping_hotels7.csv 
scraping_hotels7.csv: UTF-8 Unicode (with BOM) text, with very long lines

BOMを除いたCSVを作成し、実行した所問題なく処理ができた。

参考記事:Excelで文字化けせずに開けるCSVをRubyで作るついでに文字コードについて学んでみた。(あいまい)