Python 2.7.3 urllib2 urlopen 二进制响应

Python 2.7.3 urllib2 urlopen response in binary

我正在尝试使用 Python 2.7.3 读取 Web 服务的响应。我的请求如下:

import urllib2
import urllib
...
upgradedata = urllib.urlencode(upgradebody)
upgraderequest = urllib2.Request(UPGRADEURL, upgradedata)
upgraderequest.add_header('Accept', '*.*')
upgraderequest.add_header('Content-Type', 'text/plain')
upgraderequest.add_header('Accept-Encoding', 'gzip, deflate')

upgraderesponse = urllib2.urlopen(upgraderequest, timeout=5)
html = upgraderesponse.read();

所有教程和示例都说我可以做到:

print html

查看响应,但是当我这样做时,我得到了很多有趣的、难以理解的字符。显然这是二进制或其他东西,所以我用谷歌搜索并用谷歌搜索,最后找到了这个页面: http://bugs.python.org/issue5419

我的问题似乎是一样的,但不确定如何解决。此页面中描述的解决方案是解码二进制字符串。

如果我这样做:

print type(html)

它 returns 有:

<type 'str'>

如果我尝试在打印之前解码字符串,请执行以下操作:

print html.decode('utf-8')

我收到以下错误:

'utf8' codec con't decode byte 0x8b in position 1: invalid start byte

谁能告诉我我做错了什么?


我用来解决这个问题的实际代码是:

import urllib2
import urllib
from StringIO import StringIO
import gzip
...
upgradedata = urllib.urlencode(upgradebody)
upgraderequest = urllib2.Request(UPGRADEURL, upgradedata)
upgraderequest.add_header('Accept', '*.*')
upgraderequest.add_header('Content-Type', 'text/plain')
upgraderequest.add_header('Accept-Encoding', 'gzip')

upgraderesponse = urllib2.urlopen(upgraderequest, timeout=5)
html = None
if upgraderesponse.info().get('Content-Encoding') == 'gzip':
    stringbuffer = StringIO(upgraderesponse.read())
    gzipbuffer = gzip.GzipFile(fileobj=stringbuffer)
    html = gzipbuffer.read()

print html

因此,我从我的请求中删除了 deflate header 并使用 gzip 解压缩响应。 zlib 可能是更好的解决方案?但目前这对我来说很好。感谢 Burhan,为我指明了正确的方向。

如您所设:

upgraderequest.add_header('Accept-Encoding', 'gzip, deflate')

您得到的可能是内容的压缩版本。您需要解压缩它,试试这个:

import zlib

html = zlib.decompress(upgraderesponse.read())

或者,您可以简单地从您的请求中删除 header。