scRUBYt! で non-Unicode を通す
去年の記事([id:autch:20070406])だと、submit した先のページが non-UTF8 だったりすると死ぬのでやりなおし。
fetch 対象のページだけ NKF しても、submit や click_link した先のページが non-UTF-8 だとだめだった。
産経 NewsFlash はもうないので、わけあってここら辺からスクレイプしてみる。
#!/usr/bin/ruby -Ku # -*- mode: ruby; encoding: utf-8; -*- # このファイルは UTF-8 $KCODE = 'u' require 'rubygems' require 'nkf' # 気象庁報道発表 URL = "http://www.jma.go.jp/jma/press/index20.html" # 先に Mechanize にパッチを当てる require 'mechanize' # Mechanize の Page パーサに文字コード変換を仕込む class NKFParser < WWW::Mechanize::Page def initialize(uri = nil, response = nil, body = nil, code = nil) # UTF-8 化のついでに改行も直す new_body = NKF.nkf("--utf8 -Lu", body) # あとは丸投げ super(uri, response, new_body, code) end end # NKFParser を text/html のパーサとして指定させる class WWW::Mechanize::PluggableParser def initialize @parsers = { CONTENT_TYPES[:html] => NKFParser } @default = File end end # Scrubyt::FetchAction で @@agent をクラスレベルで # WWW::Mechanize.new に初期化してしまうので、上記パッチを当てるには # scRUBYt! はこうやって後から require しないといけない。 require 'scrubyt' # 上記パッチを当てることで、定義部分ははふつうの書き方でよくなる jma = Scrubyt::Extractor.define do fetch URL item "//li/a" do url "href", :type => :attribute title /^平成\d+年\d+月\d+日 (.*)$/ date /^平成\d+年\d+月\d+日/ end.ensure_presence_of_pattern "title" end puts jma.to_xml #jma.export(__FILE__)