2015年4月4日土曜日

Perl でエラー処理(eval)

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 件のコメント:

コメントを投稿