任务非常简单:访问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) ;
答案 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";
}
}