Почему я получаю бессмысленный контент, используя Perl WWW::Mechanize?

Perl WWW::Mechanize возвращает полный мусор (например, ðäD=°"lc*Ñ2\7 õä1û¼Âc{oî´lDNöÓ8ß5o*F2Õ©-õ£z§2ÜÝ1,³íäþwɯÓQÞÆÁS¿IZDKÁ»,ËmÅS1r4!°s,¥4Jl;\J~í2¼) после извлечения страницы.

Я уверен, что это связано с конкретным веб-сервером, с которого я пытаюсь загрузить. Мне нужен простой html.

Вот код:

#!/usr/local/bin/perl -w
use WWW::Mechanize;

$url = 'http://www.example.com/brands/';

$mech = WWW::Mechanize->new();
$mech->get($url);
$page = $mech->content();
print "$page\n";

Я предполагаю, что это может быть проблема с кодировкой.

Любые подсказки о том, как справиться с этим?

Спасибо!


person John Rand    schedule 19.10.2011    source источник
comment
Бьюсь об заклад, вы получаете сжатые данные с сервера. Что произойдет, если вы попробуете print $mech->res->decoded_content; ?   -  person friedo    schedule 19.10.2011
comment
Покажите нам заголовки ответов. (Часть $mech->res->as_string перед барахлом)   -  person ikegami    schedule 19.10.2011
comment
на всякий случай укажите свою версию WWW::Mechanize. (perl -e'use WWW::Mechanize 99' включит версию в сообщение об ошибке)   -  person ikegami    schedule 19.10.2011
comment
Я использую версию 1.66. Спасибо.   -  person John Rand    schedule 20.10.2011


Ответы (2)


Сервер может отправлять сжатый контент. Пытаться:

$page = $mech->response->decoded_content;
person frezik    schedule 19.10.2011
comment
Боюсь, это не помогло. Страница создает веб-страницу, которую можно просматривать в браузере (и работает источник просмотра). Я бы не подумал, что браузер может обрабатывать сжатый контент, не так ли? - person John Rand; 19.10.2011
comment
Да, сжатие gzip является стандартной функцией HTTP. Будет сложно отлаживать, делая предположения. Посмотрите на заголовки ответов, которые вы получаете, и посмотрите, есть ли какие-либо подсказки о кодировке или наборах символов. - person friedo; 19.10.2011
comment
Большинство браузеров (конечно, все основные) прекрасно обрабатывают сжатый контент. - person Dave Cross; 19.10.2011
comment
Хорошо, ребята, спасибо за помощь. Я никогда этого не знал. Заголовки показывают кодировку содержимого как gzip, так что я думаю, что это все. - person John Rand; 19.10.2011
comment
Я пытаюсь: #!/usr/local/bin/perl -w use WWW::Mechanize; $url = 'example.com/brands'; $mech = WWW::Mechanize-›new(); $механизм-›получить($url); мой $content = $mech-›response-›decoded_content; напечатать $контент\n; - person John Rand; 19.10.2011
comment
#!/usr/local/bin/perl -w use WWW::Mechanize; $url = 'example.com/brands'; $mech = WWW::Mechanize-›new(); $механизм-›получить($url); мой $content = $mech-›response-›decoded_content; напечатать $контент\n; Это все еще не работает для моих закодированных данных. Он возвращает использование неинициализированного значения в конкатенации (.) или строку в строке ./test.pl 9. для сайта с подозреваемым сжатым содержимым, хотя это хорошо работает для других. Действительно озадачен. - person John Rand; 19.10.2011

Я провел дни, охотясь за этим. Mechanize отправляет заголовок, утверждая, что он сжимает, поэтому сервер отвечает сжатыми данными, которые Mechanize не знает, что он должен декодировать.

Проблема проявилась с ошибкой «Ошибка чтения состояния:»

Если вы форсируете сжатие, установив и используя WWW::Mechanize::GZip, все будет работать нормально.

person Marc    schedule 07.10.2013