5

私はWWW::Mechanizeを使用しており、現在Content-Encoding: gzip、コード内の''ヘッダーでHTTP応答を処理しています。最初に応答ヘッダーを確認し、次にIO :: Uncompress::Gunzipを使用して非圧縮コンテンツを取得します。

ただし、form()、links()などのWWW :: Mechanizeメソッドが機能し、非圧縮コンテンツを解析できるように、これを透過的に実行したいと思います。WWW::MechanizeはLWP::UserAgentのサブクラスであるため、これを行うにはLWP :: UA::handlersを使用することをお勧めします。

私は部分的に成功していますが(たとえば、非圧縮のコンテンツを印刷できます)、私が呼び出すことができる方法でこれを透過的に行うことはできません

$mech->forms();

要約:$ mechオブジェクト内のコンテンツを「置換」して、それ以降、すべてのWWW :: Mechanizeメソッドが、Content-Encodingが発生しなかったかのように機能するようにするにはどうすればよいですか。

ご清聴ありがとうございました。ありがとう

4

3 に答える 3

8

WWW::Mechanize::GZipだと思います。

于 2009-05-17T11:00:47.400 に答える
3

$res->content( $bytes ) メンバーを使用して置き換えることができるようです。

ちなみに、LWP::UserAgent、HTTP::Response、HTTP::Messageのソースを見て、このようなものを見つけました。

于 2009-05-17T10:51:43.383 に答える
0

これは UserAgent に組み込まれているため、Mechanize に組み込まれています。あなたの髪を節約するための1つの重要な警告

- デバッグするには、decoded_content の呼び出し後に$@エラーがないか確認してください。

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

さらに良いことに、HTTP::Message のソースを調べて、すべてのサポート パッケージがそこにあることを確認してください。

私の場合、decoded_content は undef を返しましたが、コンテンツは生のバイナリであり、野生のガチョウの追跡を続けました。UserAgent はデコードに失敗した場合にエラー フラグを設定しますが、Mechanize はそれを無視します (発生をチェックしたり、独自のエラー/警告としてログに記録したりしません)。

私の場合 $@ sez: "IO/HTML.pm が見つかりません..評価されました

ソースに飛び込む必要があった後、組み込みのデコードプロセスが長く、細心の注意を払って困難であり、ほぼすべてのシナリオをカバーし、大量の推測を行っていることがわかりました (Gisle に感謝します!)。

あなたが偏執的である場合は、 new() ですべてのリクエストで使用されるデフォルトのヘッダーを明示的に設定してください

    $browser = new WWW::Mechanize('default_headers' => HTTP::Headers->new('Accept-Encoding' 
                            => scalar HTTP::Message::decodable()));
于 2013-09-05T09:56:12.037 に答える