解码urllib.request响应

时间:2016-10-23 08:43:09

标签: python urllib2 urllib

我打开此网址时收到此回复:

r = Request(r'http://airdates.tv/')
h = urlopen(r).readline()
print(h)

回应:

b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00\xed\xbdkv\xdbH\x96.\xfa\xbbj\x14Q\xaeuJ\xce\xee4E\x82\xa4(9m\xe7\xd2\xd3VZ\xaf2e\xab2k\xf5\xc2\n'

这是什么编码? 有没有办法根据标准库对其进行解码?
提前感谢您对此事的任何见解!

PS:好像是gzip。

2 个答案:

答案 0 :(得分:5)

它是gzip压缩的HTML,正如您所怀疑的那样。

而不是使用urllib使用requests来解压缩响应:

import requests

r = requests.get('http://airdates.tv/')
print(r.text)

您可以使用pip install requests进行安装,但不要回头。

如果您真的必须限制自己使用标准库,请使用gzip模块对其进行解压缩:

import gzip
import urllib2
from cStringIO import StringIO

f = urllib2.urlopen('http://airdates.tv/')

# how to determine the content encoding
content_encoding = f.headers.get('Content-Encoding')
#print(content_encoding)

# how to decompress gzip data with Python 3
if content_encoding == 'gzip':
    response = gzip.decompress(f.read())

# decompress with Python 2
if content_encoding == 'gzip':   
    gz = gzip.GzipFile(fileobj=StringIO(f.read())
    response = gz.read()

答案 1 :(得分:0)

mhawke的解决方案(使用requests代替urllib)完美运行,在大多数情况下应该首选。 也就是说,我一直在寻找一种不需要安装第三方库的解决方案(因此我选择urllib而不是requests)。

我找到了使用标准库的解决方案:

import zlib
from urllib.request import Request, urlopen

r = Request(r'http://airdates.tv/')
h = urlopen(r).read()
decomp_gzip = zlib.decompress(h, 16+zlib.MAX_WBITS)
print(decomp_gzip)

产生以下回应:

b'<!DOCTYPE html>\n (continues...)'