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とかいうメソッドになるらしい。これの戻り値は使われてないって解釈で良さそうに見えるんだけど、イマイチ自信がないっす。