WWW :: Mechanize игнорирует основную ссылку на сжатый контент - PullRequest
2 голосов
/ 08 марта 2012

Как видно из названия WWW :: Mechanize не распознает

<base href="" /> 

если содержимое страницы из архива. Вот пример:

use strict;
use warnings;
use WWW::Mechanize;

my $url = 'http://objectmix.com/perl/356181-help-lwp-log-after-redirect.html';

my $mech = WWW::Mechanize->new;
$mech->get($url);
print $mech->base()."\n";

 # force plain text instead of gzipped content
$mech->get($url, 'Accept-Encoding' => 'identity');
print $mech->base()."\n";

Выход:

http://objectmix.com/perl/356181-help-lwp-log-after-redirect.html
http://objectmix.com/    <--- this is correct !

Я что-то здесь упускаю? Спасибо

Редактировать: я только что протестировал его непосредственно с LWP :: UserAgent, и он работает без проблем:

use LWP::UserAgent;

my $ua = LWP::UserAgent->new();
my $res = $ua->get('http://objectmix.com/perl/356181-help-lwp-log-after-redirect.html');
print $res->base()."\n";

Выход:

http://objectmix.com/ 

Это похоже на ошибку WWW :: Mechanize?

Редактировать 2: Это ошибка LWP или HTTP :: Response, а не WWW :: Mechanize. LWP по умолчанию не запрашивает gzip. Если я установлю

$ua->default_header('Accept-Encoding' => 'gzip'),

в приведенном выше примере возвращает неверное основание

Редактировать 3: Ошибка в LWP / UserAgent.pm в parse_head ()

Он вызывает HTML / HeadParser с заархивированным HTML, и HeadParser не знает, что с ним делать. LWP должен распаковать содержимое перед вызовом процедуры синтаксического анализа.

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Об этом есть сообщение об ошибке: https://rt.cpan.org/Public/Bug/Display.html?id=54361

Вывод: в LWP отсутствует эта «функция».

WWW :: Mechanize:

Эту проблему можно в конечном итоге решить, перегрузив _make_request () в WWW :: Mechanize своим собственным pkg и переустановив HTTP :: Response с помощью decoded_content или даже более грязной, переписав $ mech -> {base} базой разбора из контента .

0 голосов
/ 09 марта 2012

Я думаю, что это не ошибка, это особенность. WWW :: Mechanize старается быть умным, потому что некоторые браузеры ведут себя одинаково, если они увидели 'base href = "", некоторые действуют иначе.

А как насчет того, когда база установлена ​​правильно?

Я думаю, что имеет смысл использовать "" или / в качестве базы.

<base href="" /> 
<base href="/" /> 
...