我正在使用 WWW::Mechanize 并且当前使用 ' 处理 HTTP 响应Content-Encoding: gzip' 在我的代码中,首先检查响应标头,然后使用 IO::Uncompress::Gunzip 获取未压缩的内容。

不过,我想透明地执行此操作,以便 WWW::Mechanize 方法(如 form()、links() 等)可以处理并解析未压缩的内容。由于 WWW::Mechanize 是 LWP::UserAgent 的子类,我更喜欢使用 LWP::UA::处理程序 去做这个。

虽然我取得了部分成功(例如,我可以打印未压缩的内容),但我无法以我可以调用的方式透明地执行此操作

$mech->forms();

总之:如何“替换” $mech 对象内的内容,以便从那时起,所有 WWW::Mechanize 方法都像 Content-Encoding 从未发生过一样工作?

我将感谢您的关注和帮助。谢谢

有帮助吗?

解决方案

其他提示

在我看来,您可以使用 $res->content( $bytes ) 成员来替换它。

顺便说一句,我通过查看 LWP::UserAgent 的来源,然后是 HTTP::Response 的来源,找到了这个东西 HTTP::消息.

它是建立与用户代理,从而机械化。 一个主要的警告,以节省您的一些头发

- 要调试,请务必检查错误的 $ @ 后调用decoded_content。

$html = $r->decoded_content;
die $@ if $@;

更重要的是,期待通过HTTP ::消息的来源,并确保所有的支持包是否有

在我的情况下,decoded_content返回民主基金,而内容是原始二进制的,我去了一个徒劳无益的。用户代理将设置错误标志上的解码失败,但机械化会忽略它(它不检查或登录发病率作为自己的错误/警告)。

在我的情况下,$ @经济特区:“找不到IO / HTML.pm ..这是eval'ed

不必潜入源之后,我发现内置的解码过程是漫长的,细致,艰苦的,涵盖几乎所有的情况下,使吨的猜测(谢谢伊斯勒!)。

如果您是偏执,显式地设置缺省头与在每个请求使用新的()

    $browser = new WWW::Mechanize('default_headers' => HTTP::Headers->new('Accept-Encoding' 
                            => scalar HTTP::Message::decodable()));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top