【问题标题】:Transparently Handling GZip Encoded content with WWW::Mechanize使用 WWW::Mechanize 透明地处理 GZip 编码的内容
【发布时间】:2010-10-26 19:59:04
【问题描述】:

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

但是,我希望透明地执行此操作,以便 WWW::Mechanize 方法(如 form()、links() 等)可以处理并解析未压缩的内容。由于 WWW::Mechanize 是 LWP::UserAgent 的子类,因此我更喜欢使用 LWP::UA::handlers 来执行此操作。

虽然我已经部分成功(例如,我可以打印未压缩的内容),但我无法以我可以调用的方式透明地做到这一点

$mech->forms();

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

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

【问题讨论】:

    标签: perl www-mechanize content-encoding lwp


    【解决方案1】:

    WWW::Mechanize::GZip,我想。

    【讨论】:

    • 谢谢!想知道我是怎么错过的 - 我确实搜索过 CPAN :)
    【解决方案2】:

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

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

    【讨论】:

    • 是的 - 它有效。谢谢。当我想做的不仅仅是 gunzip 内容时,我会使用它。现在我将只使用 Fayland 建议的模块
    • 小心,WWW::Mechanize::GZip 看起来有很多错误(参见stackoverflow.com/questions/6874076/…)。对不起,我不完全理解你所说的替换方法:你能给出一些示例代码吗?
    • @jettero:你的意思是“$res->decoded_content()”吗?无论如何,我投票赞成你的答案,因为我什至没有想过要检查这一点。所以我在perldoc HTTP::Response 中搜索“Encoding”时发现了它。谢谢!
    【解决方案3】:

    它内置于 UserAgent 中,因此是 Mechanize。 一个重要的警告可以为您节省一些头发

    -要调试,请确保在调用 decoded_content 后检查错误 $@

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

    更好的是,查看 HTTP::Message 的源并确保所有支持包都在那里

    在我的例子中,decoded_content 返回 undef,而 content 是原始二进制文件,我进行了一次疯狂的追逐。 UserAgent 将在解码失败时设置错误标志,但 Mechanize 将忽略它(它不会检查或记录发生率作为自己的错误/警告)。

    在我的例子中 $@ sez:“找不到 IO/HTML.pm .. 它被评估了

    在深入研究源代码后,我发现内置解码过程漫长、细致且艰巨,几乎涵盖了所有场景并进行了大量猜测(谢谢 Gisle!)。

    如果您偏执,请在 new() 中明确设置每个请求使用的默认标头

        $browser = new WWW::Mechanize('default_headers' => HTTP::Headers->new('Accept-Encoding' 
                                => scalar HTTP::Message::decodable()));
    

    【讨论】:

      猜你喜欢
      • 2012-03-25
      • 2015-01-17
      • 2018-02-27
      • 1970-01-01
      • 2019-05-25
      • 2017-03-16
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      相关资源
      最近更新 更多