Web::Scraper便利!

naoyaのはてなダイアリー - Web::Scraperを見て。

これはよさそう。ソース読んでみると単純に値を取得する以外にも、どうやら、配列で結果を受け取ったり、サブルーチンを渡して処理を委譲したりできるようなので、ためしにやってみよう。

use strict;
use warnings;
use Web::Scraper;
use URI;
use YAML;
use Encode;

my %result;

sub parse_title {
    my $node = shift;
    my $text = $node->as_text;
    my $left = decode_utf8('『');
    my $right = decode_utf8('』');

    my ($nth, $title, $date)
        = $text =~ m/^\[(.*?)\]\s+$left(.*?)$right(.*)$/xms;

    @result{qw(nth title date)} = ($nth, $title, $date);
}

my $onsen = scraper {
    process 'div[class="left_01"] > h3', \&parse_title;
    process 'div[class="radiotext"] > p', comment => 'TEXT';
    process 'div[class="radiolink"] > a', 'link[]' => '@href';

    result 'title', 'comment', 'link';
}->scrape(URI->new("http://lantis-net.com/rakisuta/"));

$result{comment} = $onsen->{comment};
$result{link}    = $onsen->{link};

say YAML::Dump (\%result);

実行結果はこつら。

$ perl scraper.pl
---
comment: 右といえば左!白といえば黒!天の邪鬼なあきらさん。テーマ曲が変わりました♪なんだかウキ ウキしてきちゃう☆白石さん、みんなに伝わるのかな?白石さんが饒舌に語り始めるのをBGMにあきらさん はモグモグと。切羽詰った状況はドラマを生み出すのかもしれません。
date: 20070504日配信
link:
  - http://lantis-net.com/rakisuta/002.smi
  - http://lantis-net.com/rakisuta/002.asx
nth: 第17回
title: なに食ってるんすか?

これは便利だわー。必要に応じてSelectorで取り出すだけじゃなく、サブルーチン渡すことでSelectorで取りきれないところを正規表現に任せたりできる。あと、id:naoyaさんも言ってるように、実装がすごい短くてかっこいいぜ。

Web::Scraper++