単純なWeb::Scraperの使い方

いまいち覚えられないのでメモ。

#!/usr/bin/perl

use utf8;
use strict;
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser);
use URI;

print CGI->header(-charset=>'utf-8', -type=>'text/plain');
use Encode;
use Encode::Guess;
use LWP::Simple;
use Web::Scraper;

my $uri = 'http://example.com/';

my $scraper = scraper { process '.class_name_or #id_name', 'source[]' => 'HTML'; };
my $src = decode('guess', get($uri)); 
my $scraped = $scraper->scrape($src, $uri);

print @{$scraped->{source}};

# ソースからの場合
my $scraper = scraper { process '.selector', 'some_name[]' => 'HTML'; }

my $scraped = $scraper->scrape($src)->{some_name}; # 配列(のリファレンス)


process '.selector', 'some_key[]'=>'HTML'; とした場合、
$scraper->scrapeで、連想配列が返る。
連想配列の中には、'some_key' がキー、scrapeした結果の'HTML'が配列(のリファレンス=[])で格納される。

process〜 ; をブロック内に複数記述すると、複数の要素をscrapeできる。
my $scraper = scraper {
 process '.selector1', 'some_key[]' => 'HTML';
 process '.selector2', 'some_key2[]' => 'HTML';
}

my $scraped = $scraper->scrape($src);

なら、
{
 some_key => [ "scraped_value1", "scraped_value2" , ... , "scraped_value_n" ],
 some_key2 => [ ... ],
 ...
}

といった感じ。

my $scraper = scraper { process '.some_selector', 'some_key' => '@attr'; };

ならば、attr属性の値の配列がとれる。


また、特定の属性名の値を抜き出したい場合は、

my $scraper = scraper { process '//input[@name="name_attr_value"]', 'val[]' => '@value'; }
                                 ──────────────── ←この部分はXPath形式の記述。


とする。


Leave a Reply