scrAPI日本語問題解決

あーちゃんとid:secondlifeさんのコードはちゃんと読んでみるものだと実感.「ソースコードと空気は読め」ってね.


何が悪かったって,それはEUC-JPでもUTF-8でもなく,Scraperに渡すオプションがちゃんとしてなかったってだけ.

一つはまったのが、デフォルトの html の構文解析では Tidy のライブラリを使うのですが、このライブラリがマルチバイト文字列をエンティティにしちゃうので困るという罠が…。そのため、scrape のオプションで pure ruby の HTMLParser を指定することで回避できます。

あ,やっぱハマるんだ….よくもまぁ,解決できたもんだ.流石.


コードはこんな感じになった.

require 'open-uri'
require 'rubygems'
require 'scrapi'

html = open("http://www.youtube.com/results?search_query=metal+hero+tokusatsu").read

scr = Scraper.define do
  process "div.vtitle >a[href]",
    "links[]" => "@href",
    "titles[]" => :text
  result :links, :titles
end.scrape(html, :parser => :html_parser)

puts scr.links
puts scr.titles

で,結果はちゃんとこうなる.

/watch?v=egqu_8W_NDg
/watch?v=I0zlCjZXp9A
(略)
/watch?v=WALFz54EkuQ
/watch?v=ssx2ymJYGrU
metal hero previews
1995 - Jyû Kô B-Fighter (重甲ビーファイター) OP
(略)
1988 - sekai ninja sen jiraiya (世界忍者戦ジライヤ) OP
1990 - tokkei winspector (特警ウインスペクター) OP

ビーファイター懐かしす!