2009-08-16 31 views
20

Tôi đang tìm nạp một số trang trên Web bằng cách sử dụng số LWP::UserAgent của Perl và muốn được lịch sự nhất có thể. Theo mặc định, LWP::UserAgent không liên tục xử lý nội dung nén qua gzip. Có một cách dễ dàng để làm cho nó làm như vậy, để tiết kiệm cho tất cả mọi người một số băng thông?Làm cách nào để chấp nhận nội dung được nén bằng gzip bằng LWP :: UserAgent?

Trả lời

34

LWP có khả năng này được tích hợp sẵn, nhờ HTTP::Message. Nhưng đó là một chút ẩn.

Trước tiên, hãy đảm bảo bạn đã cài đặt Compress::Zlib để có thể xử lý gzip. HTTP::Message::decodable() sẽ xuất ra danh sách các mã hóa được cho phép dựa trên các mô-đun bạn đã cài đặt; trong ngữ cảnh vô hướng, đầu ra này có dạng một chuỗi được phân tách bằng dấu phẩy mà bạn có thể sử dụng với tiêu đề HTTP 'Accept-Encoding', mà LWP yêu cầu bạn thêm vào số HTTP::Request-mình. (Trên hệ thống của tôi, với Compress::Zlib cài đặt, danh sách là "gzip, x-gzip, deflate".)

Khi HTTP::Response của bạn trở lại, hãy chắc chắn để truy cập nội dung với $response->decoded_content thay vì $response->content.

Trong LWP::UserAgent, tất cả đến với nhau như thế này:

my $ua = LWP::UserAgent->new; 
my $can_accept = HTTP::Message::decodable; 
my $response = $ua->get('http://stackoverflow.com/feeds', 
    'Accept-Encoding' => $can_accept, 
); 
print $response->decoded_content; 

này cũng sẽ giải mã văn bản thành các chuỗi unicode Perl. Nếu bạn chỉ muốn LWP giải nén các phản ứng, và không gây rối với các văn bản, làm như vậy:

print $response->decoded_content(charset => 'none'); 
+0

Lưu ý: Đây làm việc với LWP 5,814 (từ ngày 08) hoặc mới hơn. –

+3

Từ thử nghiệm của tôi với LWP 6.03 tất cả những gì được yêu cầu là sử dụng 'decoded_content' thay vì' nội dung'. – Cas

Các vấn đề liên quan