scrAPI

scrAPIのお勉強を始めました。簡単なサンプルは結構見つかるんだけど、困ったのでソースを追っかけました。まずScraper.defineが何をやっているのかが気になりました。

module Scraper
  def self.define(&block)
    kls = Class.new(Scraper::Base)
    kls.module_eval &block
    return kls
  end
end

Scraper::Baseの派生クラスを生成して、そのコンテキストでScraper.defineに渡されたブロックが評価されます。つまり、attr_accessorとかdef fooとかふつーのクラスっぽい宣言をしちゃってもOKなわけです。それからarrayとかresultもメソッドを宣言するのが主な役割なので、以下のように書くことができます。

Scraper.define do
  array :rows
  process "table tr" do |row|
    self.rows ||= []
    self.rows << {:some_key => 'some_data'}
  end
  result :rows
end

でも、processメソッドに渡されるブロックは、内部で__extractorとかいうメソッドになるらしい。これの戻り値は使われてないって解釈で良さそうに見えるんだけど、イマイチ自信がないっす。