Perl HTML Tree Builder, как обрабатывать ошибки
Задача довольно проста: получить доступ к 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(); $ Р-> синтаксического анализа ($ response-> содержание); } еще { warn "Не удалось получить $url: ", $response->status_line, "\n"; }
Короче тот, который не
использовать HTML::TreeBuilder; $url="http://some_url.com/blahblah"; $tree = HTML::TreeBuilder->new_from_url($url);
2 ответа
Цитировать документы:
Если LWP не может получить URL-адрес или ответ не является HTML (как определено
content_is_html
в HTTP:: Заголовки), затем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";
}
}
скрипт просто выходит
Нет, это исключение. Вы всегда можете поймать исключение с eval BLOCK
если ты так желал.
my $tree = eval { HTML::TreeBuilder->new_from_url($url) }
or warn($@);