Nokogiri使ってスクレイピング

Railsチュートリアルが終わったので
Rubyの基本文法をcode academyとかで写経しながら以前スクレイピングしてみたが、open-uriのcharsetの取得の仕方で躓いた。

対象ページの文字コードUTF-8で期待値が”UTF-8”にもかかわらず、
open(uri).charsetで取得できる文字コード
"iso-889-1"になるため文字化けして出力されてしまう場合があるということが判明した。

YahooのTOPページなどは問題な”UTF-8”で取得できるのだが
一部ページではiso-8859-1といった具合。

ソースコードは以下(scrape_title.rb)

#URLにアクセスするためのライブラリの読み込み
require 'open-uri'
#Nokogiriライブラリの読み込み
require 'nokogiri'
#スクレイピング先のURL
uri = 'http://tenjin.keizai.biz/headline/archives/'
charset = nil

html = open(uri) do |f|
         charset = f.charset #文字種別を取得
                if charset == "iso-8859-1"
                        charset = "UTF-8"
                end
        html =  f.read #htmlを読み込んで変数htmlに渡す
end
#htmlをパースしてオブジェクトを生成
parse_doc = Nokogiri::HTML.parse(html,nil,charset)

parse_doc.xpath('//div[@class="item"]').each do |node|
#記事タイトルを表示
p node.css('span').inner_text

end

open-uriライブラリのマニュアルに以下のように書いてあった。

URI のスキームが HTTP であり、自身のタイプが text である場合は、 [RFC2616] 3.7.1 で定められているとおり、文字列 "iso-8859-1" を返します。

https://docs.ruby-lang.org/ja/latest/class/OpenURI=3a=3aMeta.html

実行すると取得はできた
f:id:sunecosuri_san:20170130125500p:plain


一旦、”iso-8859-1”だったらUTF-8に指定というような記述をしているが絶対にスマートではない
もう少しスマートな方法があるはず、、

参考ブログ
inobo52.hatenablog.com