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__)