WWW :: Mechanize忽略gzip压缩内容的基本href

时间:2012-03-08 11:49:07

标签: perl gzip base www-mechanize

标题显示WWW :: Mechanize无法识别

<base href="" /> 

如果页面内容iz gzipped。这是一个例子:

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 bug?

编辑2: 它是LWP或HTTP :: Response错误,而不是WWW :: Mechanize。 LWP默认不请求gzip。如果我设置

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

在上面的示例中,它返回错误的基础

编辑3: 错误在parse_head()中的LWP / UserAgent.pm

它使用gzip压缩HTML调用HTML / HeadParser,HeadParser不知道如何处理它。在调用解析子例程之前,LWP应该对内容进行gunzip。

2 个答案:

答案 0 :(得分:1)

有关于此的错误报告:https://rt.cpan.org/Public/Bug/Display.html?id=54361

结论:LWP缺少这个“功能”。

<强> WWW ::机械化:

最终可以通过使用您自己的pkg重载WWW :: Mechanize中的_make_request()并通过decode_content重新设置HTTP :: Response来解决这个问题,甚至可以通过使用解析库来覆盖$ mech-&gt; {base}来解决这个问题。内容。

答案 1 :(得分:0)

我认为这不是一个错误,它是一个功能。 WWW :: Mechanize试图变得聪明,因为如果某些浏览器看到基础href =&#34;&#34;&#39;&#39;有些人则采取其他行动。

什么时候基地设置为prroperly?

我认为使用&#34;&#34;或/作为基础。

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