#perl #www-mechanize
#perl #www-mechanize
Вопрос:
я очень новичок в perl. Я объясняю, как использовать Mechanize package. У меня есть страница примера. Я не знаю, хорошо ли это для обучения, потому что это работает странным образом, но все же я хочу понять, что происходит прямо сейчас.
Во-первых, я написал скрипт, который получает непосредственно содержимое под страницей1:
my $mech = WWW::Mechanize::Frames-> new();
my $mechFr = WWW::Mechanize::Frames-> new();
my $url="page1 url";
$mech->get($url);
my @frames = $mech->get_frames();
$mechFr= $frames[0];
print $mechFr->content();
И это работает нормально.
Затем я пытался перейти на эту страницу со страницы 0, и я написал это:
my $mech = WWW::Mechanize::Frames-> new();
my $mechFr = WWW::Mechanize::Frames-> new();
my $url="page0url";
$mech->get($url);
$mech=$mech->follow_link(text_regex => qr/page1like/);
print $mech->content();
my @frames = $mech->get_frames();
$mechFr= $frames[0];
print $mechFr->content();
Содержимое по следующей ссылке mech afeter выглядит нормально (я действительно на странице 1), но затем я получаю сообщение об ошибке Can't locate object method "get_frames" via package HTTP:Headers" at (...)/Message.pm line 694"
. Мой список пакетов одинаков в обоих сценариях:
use strict;
use warnings;
use WWW::Mechanize::Frames;
Итак, мой вопрос в том, что я делаю не так?
Комментарии:
1.
$mech=$mech=>follow_link()
это то, что его нарушает. Вы забиваете свой оригинальный $ mech.
Ответ №1:
Согласно WWW::Mechanize documentation
$mech->follow_link(...)
возвращениям HTTP::Response объект, вы присваиваете этот результат своей переменной $mech
. Это эффективно заменяет существующее значение $mech
на HTTP::Response объект.
The HTTP::Response модуль не имеет метода get_frames()
, как правильно сообщает вам Perl.
Вам необходимо сохранить ваш HTTP-ответ в отдельной переменной:
my $mech = WWW::Mechanize::Frames-> new();
my $mechFr = WWW::Mechanize::Frames-> new();
my $url="page0url";
$mech->get($url);
my $http_response = $mech->follow_link(text_regex => qr/page1like/);
print $http_response->content();
my @frames = $mech->get_frames();
$mechFr= $frames[0];
print $mechFr->content();
Комментарии:
1. Спасибо, это сработало. Я видел эту документацию и попробовал аналогичную вещь, думаю, в тот раз я сделал что-то другое неправильно. Спасибо!
2. Лучше:
$mech->follow_link(...); print $mech->content();
3. Хранит ли он HTTP::Response и внутренне тоже?. Я не знаком с
WWW::Mechanize
.4. @HunterMcMillen, да, Mechanize хранит ответы внутри. (На самом деле это стек ответов, потому что у него есть
back
метод, очень похожий на кнопку возврата браузера.)