二进制

时间:2015-07-30 07:14:46

标签: python-2.7 response urllib2 urlencode webservice-client

我正在尝试使用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指出我正确的方向。

1 个答案:

答案 0 :(得分:0)

正如你设定的那样:

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

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

import zlib

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

或者,您只需从请求中删除该标头即可。