Web::Scraperのソースコードを見ていると、processの引数に無名配列を
与えると、得られた値にフィルターに通すことができることがわかった。
perldocにも書いていないっぽいので自分で書いてみた。
Yahooの AV女優のブログカテゴリから 名前と URLを取得するという
コードを書いてみた。
#!/usr/bin/env perl use strict; use warnings; use Web::Scraper; use URI; use Encode; my $BLOG_URL = 'http://dir.yahoo.co.jp/Entertainment/Miscellaneous/Adult/Adult_Weblog/Porn_Stars_Weblog/'; my $blog_list = scraper { process "li.site", "sites[]" => scraper { process "strong a", link => '@href'; process "strong a", name => [ 'TEXT', sub { (split /\s-/, $_[0])[0]; } ]; }; }; my $blog_infos = $blog_list->scrape( URI->new($BLOG_URL) ); foreach my $blog_info ( @{$blog_infos->{'sites'}} ) { print encode_utf8($blog_info->{name}); print ":", $blog_info->{link}, "\n"; }
桜まい:http://ameblo.jp/saku-mai/ 夢野まりあ:http://ameblo.jp/maria-yumeno/ 明日花キララ:http://blog.livedoor.jp/pre_asuka_kirara/ 小澤マリア:http://blog.livedoor.jp/ozawa_maria/ 真崎寧々:http://masakinene.blog115.fc2.com/ .....
うまくいったみたい。
(一部例外もあるけど)このページでは "名前 - ブログタイトル"って
ことで, AV女優の名前とブログタイトルが得られる。それにフィルタを
かけて名前を直接得る。
process "strong a", name => [ 'TEXT', sub { (split /\s-/, $_[0])[0]; } ];
具体的には 'TEXT'で目的の文字列を取得して、次の無名関数で
ハイフンと空白をどけて一番始めの名前を取得している。
ハイフンつきの文字列を取得して後で切り分けるという方が
いいのかもしれないですが、これだと scrape関数内にすべてを
おさめることができるな〜ってことで書いてみた。