Каков предпочтительный метод доступа к ответам WWW::Mechanize?

Обе эти версии хороши или одна из них предпочтительнее?

#!/usr/bin/env perl
use strict;
use warnings;
use WWW::Mechanize;

my $mech = WWW::Mechanize->new();
my $content;

# 1
$mech->get( 'http://www.kernel.org' );
$content = $mech->content;
print $content;

# 2
my $res = $mech->get( 'http://www.kernel.org' );
$content = $res->content;
print $content;

person sid_com    schedule 27.03.2010    source источник


Ответы (3)


контент( ) иногда удобнее:

$mech->content(...)

Возвращает содержимое, которое механизм использует внутри для последней извлеченной страницы. Обычно это то же самое, что и $mech->response()->content(), но это может отличаться для HTML-документов, если «update_html» перегружен и/или дополнительные именованные аргументы передаются в content():

$mech->content( format => 'text' )

Возвращает текстовую версию страницы с удаленной разметкой HTML. Для этой функции требуется установленный HTML::TreeBuilder, иначе будет выдана фатальная ошибка.

$mech->content( base_href => [$base_href|undef] )

Возвращает HTML-документ, измененный, чтобы содержать разметку в заголовке. $base_href равно $mech->base(), если не указано иное. Это удобно для передачи HTML, например. HTML:: Показать.

person Eugene Yarmash    schedule 27.03.2010
comment
$mech-›content(format =› 'text') не работает с моей машиной. (HTML::TreeBuilder установлен) - person sid_com; 27.03.2010
comment
Проверьте свою версию, вам нужен WWW::Mechanize 1.05_03 или выше (выпущен в 2004 году) - person rjh; 28.03.2010
comment
Хорошо, это работает, может быть, я был в багажнике, когда пробовал. Но была ли недавно версия WWW::Mechanize, в которой эта функция не работала с perl 5.10.0 или 5.10.1? - person sid_com; 31.03.2010

Они оба приемлемы. Второй мне кажется чище, потому что он возвращает правильный объект HTTP::Response. которые вы можете запрашивать и вызывать методы, а также означает, что если вы сделаете другой Mechanize запрос, у вас по-прежнему будет доступ к старому ответу HTTP. При вашем первом подходе каждый раз, когда вы делаете запрос, метод content будет меняться на что-то новое, что кажется подверженным ошибкам.

Кстати, для любого метода вы должны проверить $response->is_success или $mech->success перед доступом к содержимому, так как запрос мог быть неудачным.

person rjh    schedule 27.03.2010
comment
Из perldoc: у автономных экземпляров WWW::Mechanize включена автоматическая проверка. Однако, если WWW::Mechanize является подклассом, он отключен. - person Eugene Yarmash; 27.03.2010
comment
Ух ты, в последний раз, когда я использовал Mechanize, такой опции не существовало. Это было в 2008 году... сейчас я чувствую себя старым :( - person rjh; 27.03.2010
comment
Я добавил автопроверку из-за того, насколько часто люди заходят на IRC-канал #perl и жалуются, что $mech-›content пуст, потому что они не удосужились проверить $mech-›success. Теперь самый распространенный случай — это по умолчанию. - person Andy Lester; 01.04.2010

$mech->content специально там, так что вы можете обойти необходимость получения ответа результата. Чем проще, тем лучше.

person Andy Lester    schedule 31.03.2010