2009-05-17 3 views
4

WWW :: Mechanize를 사용하고 있으며 현재 응답 헤더를 확인한 다음 IO :: Uncompress :: Gunzip을 사용하여 코드에서 'Content-Encoding: gzip'헤더로 HTTP 응답을 처리하고 있습니다. 압축되지 않은 콘텐츠를 얻으려면GZip으로 인코딩 된 내용을 WWW :: Mechanize로 투명하게 처리합니다.

그러나 WWW :: Mechanize와 같은 방법으로 form(), links() 등의 작업을 수행하고 압축되지 않은 내용을 구문 분석 할 수 있도록이 작업을 투명하게 수행하고 싶습니다. WWW :: Mechanize는 LWP :: UserAgent의 하위 클래스이므로이 작업을 수행하려면 LWP::UA::handlers을 사용하는 것이 좋습니다.

나는 (I 예를 들어 압축되지 않은 내용을 인쇄 할 수 있습니다), 내가 요약

$mech->forms(); 

를 호출 할 수있는 방법으로 투명하게이 작업을 수행 할 수없는 나는 부분적으로 성공했지만 : 어떻게 "교체하는 "그 시점부터 모든 WWW :: Mechanize 메소드가 Content-Encoding이 일어나지 않았던 것처럼 작동하도록 $ mech 객체의 내용?

귀하의 관심과 도움에 감사드립니다. 감사합니다.

답변

7

WWW::Mechanize::GZip라고 생각합니다.

+0

감사! 원더 나는 그것을 놓쳤다 - 나는 CPAN 검색을했다 :) –

3

$ res-> content ($ bytes) 멤버를 사용하여 교체 할 수 있습니다.

덧붙여서, 저는 LWP :: UserAgent 소스를보고 HTTP :: Response를보고이 항목을 발견했습니다. HTTP::Message.

+0

예 - 작동합니다. 감사합니다. gunzip 콘텐츠 이상을 원할 때 사용합니다. 지금은 t 그는 Fayland가 제안한 모듈 –

+0

WWW :: Mechanize :: GZip은 상당히 버그가있는 것처럼 보입니다 (http://stackoverflow.com/questions/6874076/perl-how-to-avoid-diagnostic-messages-from-not- 직접 포함 모듈). 죄송합니다, 당신이 말하는 replace 메소드를 완전히 이해하지 못했습니다 : 예제 코드를 줄 수 있습니까? – 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가 반환되어 있는지 확인 미확정 내용은 원시 이진이고, 나는에가는 동안 야생 거위 추격전. UserAgent는 디코딩 실패시 오류 플래그를 설정하지만 Mechanize는 무시합니다 (자체 오류/경고로 발생률을 확인하거나 기록하지 않습니다). 내 경우 $의 @에서

는 경제 특구 : "IO를 찾을 수 없습니다/HTML.pm .. 그것은 소스로 다이빙을 한 후

을 eval'ed했다, 나는이 내장 디코딩 과정 알아 거의 모든 시나리오를 덮고 추측의 톤을, 긴 세심한하고 힘든

. (! 당신에게 Gisle 감사) 당신이 편집증 경우, 명시 적으로 새로운()

에서 모든 요청과 함께 사용되는 기본 헤더를 설정
$browser = new WWW::Mechanize('default_headers' => HTTP::Headers->new('Accept-Encoding' 
          => scalar HTTP::Message::decodable()));