我正在尝试使用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
看到响应,但是当我这样做时,我会得到很多有趣,难以理解的角色。显然这是二进制或其他东西,所以我用Google搜索并用Google搜索,最后找到了这个页面: http://bugs.python.org/issue5419
我的问题似乎相同,但不确定如何解决这个问题。本页描述的解决方案是解码二进制字符串。
如果我这样做:
print type(html)
它返回:
<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,并使用gzip解压缩响应。 zlib可能是更好的解决方案吗?但目前这对我来说很好。谢谢Burhan指出我正确的方向。
答案 0 :(得分:0)
正如你设定的那样:
upgraderequest.add_header('Accept-Encoding', 'gzip, deflate')
您有可能获得内容的压缩版本。你需要解压缩它,试试这个:
import zlib
html = zlib.decompress(upgraderesponse.read())
或者,您只需从请求中删除该标头即可。