Perl пытается использовать неправильный пакет

#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 метод, очень похожий на кнопку возврата браузера.)