« Happy Wedding! | Home | Shibuya.pm Teck Talk #8行ってきました »

[Perl]   Web::Scraper 0.15とcisco_scraper.pl

以前書いた Web::ScraperでCISCO RECORDSをスクレーピングという記事に対してBig Sky :: Web::Scraper 0.15で何が変わったのか...とおまけでWeb::Scraper 0.15での添削例として扱ってもらったので、さらにリプライ。

treeを壊さずやるとすれば、TextNodeを参照するのがいいかと思います。 例えば、XPathのnode()を使い、番号指定で取得します。だた現状のWeb::ScraperではTextNodeはショートカットで参照出来ませんので、以下のようにstring_valueを返すように手を加えると上手く行きます。
問題が一つ。 添削してくださったパッチだと
process '//li/node()[4]', 'title' => sub {$_->string_value;};
となっているのですが、4番目とは限らないんです。

たとえば、
http://www.cisco-records.co.jp/html/item/004/010/item393180.html
は何曲か試聴サンプルがないために、この処理だと取得できないです。

ただ
process '//p[@class="de_star"]/node()[2]', 'star' => sub {$_->string_value;};

こちらは例外がないのでばっちり動きます。
更にさっきアップされていた0.16では

0.16 Tue Sep 18 04:48:47 PDT 2007
- Support 'RAW' and 'TEXT' for TextNode object

ということなので

process '//p[@class="de_star"]/node()[2]', 'star' => 'TEXT';

でも、大丈夫でした。

あと、相対URLの展開ですが、今のところコールバック関数内では展開されないようです。
なので、添削していただいたものでは意図するように動かないようです。
ただ、こっちは深く追っていないので定かではありません。つっこみ歓迎です。

ともかく、フィードバックありがとうございました。
大変勉強になりました。

Trackbacks:

このエントリーのトラックバックURL:

コメントを投稿