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。
我正在尝试使用 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。