Perl を使って Webページのスクレイピングを行なっておりますが、パターンにマッチしなかった時にエラー終了してしまい、それをどう処理(ハンドリング)するのか悩んでおりました。
インターネットで調べたところ eval を使ってエラーハンドリングすることができることがわかりました。
以下のサンプルプログラムでは、Web::Scraper を使って、スクレイピングを行なっていますが、パターンにマッチしなかった場合には、エラーを表示したのちに、終了コード 1で終了します。
#!/usr/bin/perl
use strict;
use warnings;
use Web::Scraper;
use URI;
use Encode;
sleep(10.5);
my $KATAKAKU = $ARGV[0];
my $url = "http://xxxxxxxx.com/search?i=All&kwd=" . $KATAKAKU;
my $scraper = scraper {
process '//ul[@class="item_condition_list"]/li[@class="price"]','price[]' => 'TEXT';
process '//span[@class="item_title"]/a[@class="original_link"]','asin[]' => '@href';
process '//span[@class="item_title"]/a[@class="original_link"]','spec[]' => 'TEXT';
};
my $res;
eval{
$res = $scraper->scrape(URI->new($url));
};
if ($@){
print "ERROR: $@";
exit 1;
}
my @spec;
my @price;
my @asin;
eval {
@spec = @{$res->{spec}};
@price = @{$res->{price}};
@asin = @{$res->{asin}};
};
if ($@){
print "ERROR: $@";
exit 1;
}
my $length = @price;
print "xxxxxxx_spec: ".encode('sjis',$spec[0])."\n";
print "xxxxxxx_price: ".encode('sjis',$price[0])."\n";
print "xxxxxxx_asin: ".encode('sjis',$asin[0])."\n";
print "array_length: " . $length ."\n";
0 件のコメント:
コメントを投稿