2009-11-09 41 views
5

Tôi hiện sử dụng cơ giới hóa để đọc trang web đã giải nén như sau:Chuyển đổi gzip dữ liệu lấy bằng urllib2 sang HTML

br = mechanize.Browser() 
br.set_handle_gzip(True) 
response = br.open(url) 
data = response.read() 

Tôi tự hỏi làm thế nào để giải nén dữ liệu đã giải nén lấy bằng urllib2 cho văn bản HTML?

req = urllib2.Request(url) 
opener = urllib2.build_opener() 
response = opener.open(req) 
data = response.read() 
if response.info()['content-encoding'] == 'gzip': 
    HOW TO DECOMPRESS DATA TO HTML 

Trả lời

14

Hãy thử điều này:

import StringIO 
data = StringIO.StringIO(data) 
import gzip 
gzipper = gzip.GzipFile(fileobj=data) 
html = gzipper.read() 

html bây giờ sẽ giữ HTML (In nó để xem). Xem here để biết thêm thông tin.

+0

Bạn cũng có thể chỉ cần thực hiện 'gzip.decompress (dữ liệu)'. –

+0

Đây không phải là thực sự làm việc trong trường hợp này như được giải thích trong bài viết này: http://rationalpie.wordpress.com/2010/06/02/python-streaming-gzip-decompression/ vì vậy bạn phải sử dụng zlib thay vì gzip – gabuzo

+0

@ Trên thực tế, bài viết liên quan đến giải nén _streaming_ gzip, điều này thực sự rất khác với chủ đề của câu hỏi này, vì điều này đặc biệt đề cập đến dữ liệu đã được tìm nạp, trong khi trong tình huống phát trực tuyến bạn muốn giải nén khi bạn nhận được nó. –

-2
def ungzip(r,b): 
    headers = r.info() 
    if ('Content-Encoding' in headers.keys() and headers['Content-Encoding']=='gzip') or \ 
     ('content-encoding' in headers.keys() and headers['content-encoding']=='gzip'): 
     import gzip 
     gz = gzip.GzipFile(fileobj=r, mode='rb') 
     html = gz.read() 
     gz.close() 
     headers['Content-type'] = 'text/html; charset=utf-8' 
     r.set_data(html) 
     b.set_response(r)