1

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

更长的代码有效

使用 LWP::Simple;
使用 LWP::UserAgent;
使用 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);

    } 别的 {

    警告“无法获取 $url:”,$response->status_line,“\n”;

    }

较短的没有

使用 HTML::TreeBuilder;

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

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

2 回答 2

3

脚本简单地退出

不,它会引发异常。如果你愿意,你总是可以捕捉到异常eval BLOCK

my $tree = eval { HTML::TreeBuilder->new_from_url($url) }
   or warn($@);
于 2013-06-11T02:32:58.287 回答
3

引用文档

如果 LWP 无法获取 URL,或者响应不是 HTML(由content_is_htmlHTTP::Headers 确定),则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";
    }
}
于 2013-06-11T02:41:55.287 回答