Web::Scaraperを使ってCDBabyからタイトルと金額を取得する

 Webページから欲しい情報を取得してしまおうというのがスクレイピング。スパイダリングなんて言い方もする。
でもHTMLっていろいろな書き方があるからこれがなかなか大変。

 今まではHTML::TreeBuilderとかHTML::TokeParserを使っていたけど、Web::Scraperという便利なものがあるということでやってみました。
"CDBaby"というインディーズなどマイナーなCDが売っているサイトの「ラグタイム」というジャンルから、TOP40のCDタイトル名・価格・URLを抜き出してみます。

コード

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

my $url = new URI('http://cdbaby.com/top/223');

my $scraper = scraper {
        process 'div.albumbox>h3>a',      'title' => 'TEXT',
                                          'link'  => '@href';
        process 'div.albumbox>div.price', 'price' => 'TEXT';
        #result 'title', 'link', 'price';
};

my $item = scraper {
        process 'div#content li', 'result[]' => $scraper;
        #result 'result';
};

my $res = $item->scrape($url);
warn Dump $res;

出力結果

  - link: !!perl/scalar:URI::http http://cdbaby.com/cd/duck3
    price: 'CD price: $15.00'
    title: 'DUCK BAKER: Do You Know What It Means To Miss New Orleans'
  - link: !!perl/scalar:URI::http http://cdbaby.com/cd/finnreilly2
    price: 'CD price: $12.50'
    title: 'FRED MICKEY FINN AND CATHY REILLY: The Entertainers'
  - link: !!perl/scalar:URI::http http://cdbaby.com/cd/celletti1
    price: 'CD price: $14.00'
    title: 'ALESSANDRA CELLETTI PLAYS SCOTT JOPLIN: Black Baby
 ・・・
 ・・・

XPathではなくCSSセレクタで指定しました。
ところで、コメントアウトした result行 はよくわかっていません・・。
他のコードを見ているとよく指定しているんだけど、コメントしても結果は変わりませんでした。