2009-05-17 8 views
4

WWW :: Mechanizeを使用していて、現在レスポンスヘッダーを確認してIO :: Uncompress :: Gunzipを使用してコード内の 'Content-Encoding: gzip'圧縮されていないコンテンツを取得します。GZipでエンコードされたコンテンツをWWW :: Mechanizeで透過的に処理する

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

私は(私は、例えば、非圧縮のコンテンツを印刷することができます)、部分的に成功しているが、私は私が要約すると

$mech->forms(); 

を呼び出すことができるように、透過的にこれを実行することができません:どのように私は「置き換えますその時点以降、すべてのWWW :: Mechanizeメソッドは、Content-Encodingが起こったことがないように動作します。

私はあなたの注意と助けていただきありがとうございます。 ありがとう

答えて

7

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

+0

ありがとう!私がそれを見逃してどのように驚いた - 私は検索CPAN :) –

3

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

ところで、私はLWP :: UserAgentのソースを見て、次にHTTP :: Responseを見て、次にHTTP::Messageというものを見つけました。

+0

はい - それは動作します。ありがとうございますgunzipコンテンツ以上のことをしたいときに使用します。彼はFaylandによって提案されたモジュール –

+0

WWW :: Mechanize :: GZipはかなりバギーに見えます(http://stackoverflow.com/questions/6874076/perl-how-to-avoid-diagnostic-messages-from-not-直接組み込まれたモジュール)。申し訳ありませんが、あなたが話している置換方法を完全に理解していません。いくつかのコード例を挙げてください。 – MarcoS

+0

@jettero: "$ res-> decoded_content()"を意味しましたか?いずれにせよ、私はあなたの答えを投票しました。私はそれをチェックすることさえ考えなかったからです。だから私は[perldoc HTTP :: Response](http://search.cpan.org/perldoc?HTTP::Response)で "Encoding"を検索したときに見つけました。ありがとう! –

0

これはUserAgentで組み込まれているため、Mechanizeです。あなたにいくつかの髪

-Toデバッグを保存する一つの主な注意点、あなたがdecoded_contentを呼び出した後 @エラー$をチェックしてください。

$html = $r->decoded_content; 
die [email protected] if [email protected]; 

いっそのこと、HTTP ::メッセージのソースに目を通すと、すべてのサポートパッケージは、私の場合は

は、decoded_contentが返されていることを確認してくださいundefをコンテンツは、生のバイナリがある、と私は上で行ってきましたしながら、野生のガチョウの追跡。 UserAgentはデコード失敗時にエラーフラグを設定しますが、Mechanizeはそれを無視します(発生率をエラー/警告としてチェックまたは記録しません)。私の場合$ @をのSEZで

:「それはソースに飛び込むした後

をevalされたされたIO/HTML.pm ..見つけることができません、私は内蔵のデコード処理されて見つけますちょうど約すべてのシナリオをカバーし、推測のトンを作り、長い細心の、骨の折れる(あなたGisleをありがとうございました!)。

あなたが被害妄想している場合、明示的に)(新しい

ですべての要求で使用するデフォルトのヘッダーを設定します
$browser = new WWW::Mechanize('default_headers' => HTTP::Headers->new('Accept-Encoding' 
          => scalar HTTP::Message::decodable())); 
関連する問題