読者です 読者をやめる 読者になる 読者になる

WebScraperのフィルター機能

perl scraper

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関数内にすべてを
おさめることができるな〜ってことで書いてみた。