perl html treebuilder如何处理错误情况

时间:2013-06-11 02:02:21

标签: perl lwp html-tree

任务非常简单:访问URL并根据结果解析它。如果出现错误(404,500等),请采取适当的措施。最后一块是我遇到的问题。
我列出了我目前使用的两段代码。较长的一个(LWP + TreeBuilder)适用于两种情况;较短的一个(TreeBuilder)适用于第一个条件,但不适用于错误条件。如果我使用TreeBuilder并且该站点返回404或其他一些错误,则该脚本将退出!有什么想法吗?

更长的代码

use LWP::Simple;
use LWP::UserAgent;
use HTML::TreeBuilder;

$url="http://some_url.com/blahblah" ;
$response = LWP::UserAgent->new->request( HTTP::Request->new( GET => $url ));
    if ($response->is_success) {

    $p = HTML::TreeBuilder->new();
    $p->parse($response->content);

    } else {

    warn "Couldn't get $url: ", $response->status_line, "\n";

    }

较短的

use HTML::TreeBuilder;

$url="http://some_url.com/blahblah" ;

$tree = HTML::TreeBuilder->new_from_url($url) ;

2 个答案:

答案 0 :(得分:3)

  

脚本只是退出

不,它会引发异常。如果您愿意,可以随时使用eval BLOCK来捕获异常。

my $tree = eval { HTML::TreeBuilder->new_from_url($url) }
   or warn($@);

答案 1 :(得分:3)

引用the docs

  

如果LWP无法获取URL,或者响应不是HTML(由HTTP :: Headers中的content_is_html确定),则new_from_url将死亡,HTTP :: Response对象为在$HTML::TreeBuilder::lwp_response中找到。

试试这个:

use strict;
use warnings;
use HTML::TreeBuilder 5; # need new_from_url
use Try::Tiny;

my $url="http://some_url.com/blahblah" ;
my $p = try { HTML::TreeBuilder->new_from_url($url) };
unless ($p) {
    my $response = $HTML::TreeBuilder::lwp_response;
    if ($response->is_success) {
        warn "Content of $url is not HTML, it's " . $response->content_type . "\n";
    } else {
        warn "Couldn't get $url: ", $response->status_line, "\n";
    }
}