Diggin_Scraperではより強力な取得方法として、perlのWeb::Scraperと同様の、ブロック構造(多次元配列)での取得をサポートしています。
ブロック構造での取得については、Web::Scraper用に記述された以下の記事を参照してください。 Web::Scraper でいい感じのデータ構造になってくれなくて困っているのはどこのどいつだ〜い? アタイだよ!
Diggin_Scraperでは、このブロック構造での取得を容易にするために、Diggin_Scraperのインスタンスが配列にセットされた場合、再起的に処理を行います。
//まず、再起処理用のDiggin_Scraperインスタンスを生成します。
$ranking = new Diggin_Scraper();
//次に、scrapeメソッドを実行するDiggin_Scraperクラスでのprocessメソッドと同様に取得要素を指定します。
$ranking->process('.', 'rank => [@background, "Digits"]')
->process('img', 'star => @alt', 'image => @src')
->process('td.text', 'text => TEXT')
->process('.//td[contains(@class, "lucky") and (not(contains(@valign, "bottom")))]', 'lucky => TEXT');
//上記で作った"$ranking"を、Diggin_Scraperのprocessメソッドにて連想配列としてセットします。
$scraper = new Diggin_Scraper();
$scraper->process('//td[@class="day" and @height < 100]', 'date => "TEXT"')
->process('//table[contains(@background, "item/rank")]', array('ranking[]' => $ranking))
->scrape($url);
Diggin_Scraperの現バージョンでは、取得要素が見つからない箇所については、配列のセットに値は格納されず、それ以降のプロセスに対して処理を行いません。 以下に簡単な例を示します。
$html = <<<HTML
<html>
<body>
<div class="a">
<a>link </a>
<a href="2">link2</a>
<a href="3">link3</a>
</div>
<div class="a">
<ul>
<li><a href="href1.html">value1</a></li>
<li>value2</li>
<li>value3</li>
</ul>
</div>
</body>
</html>
HTML;
$li = new Diggin_Scraper;
$li->process('//li', 'li[] => TEXT');
$scraper = new Diggin_Scraper();
$scraper->setUrl('http://example.com/');
$scraper->process('//div', array('div[]' => $li))
->scrape(array($html));
var_dump($scraper->div);
HTMLでのdivそれぞれのブロックに対し、liでの取得を行っています。 このコードの実行結果は以下の通りです。
array(1) {
[1]=>
array(1) {
["li"]=>
array(3) {
[0]=>
string(6) "value1"
[1]=>
string(6) "value2"
[2]=>
string(6) "value3"
}
}
}
結果にあるとおり、li要素がない一つ目のdivブロックは格納されていません。また、配列キーにはdiv対象だった配列2つ目のキー'1'として格納されています。