Python urllib2 是否自动解压从网页获取的 gzip 数据?

74 投票
4 回答
36550 浏览
提问于 2025-04-16 05:34

我正在使用

 data=urllib2.urlopen(url).read()

我想知道:

  1. 我怎么知道一个网址上的数据是否经过了gzip压缩?

  2. urllib2会自动解压缩那些经过gzip压缩的数据吗?这些数据总是字符串吗?

4 个回答

5

你的问题已经得到回答,不过如果想要更全面的实现,可以看看Mark Pilgrim的实现。这个实现涵盖了gzip、deflate、安全的URL解析等等,适用于一个广泛使用的RSS解析器,虽然它比较复杂,但仍然是个很有用的参考。

8

如果你说的是一个简单的 .gz 文件,那么不,urllib2 不会对它进行解码,你得到的还是原封不动的 .gz 文件。

如果你说的是通过 HTTP 自动进行的压缩,比如使用 Content-Encoding: gzipdeflate,那么客户端需要特别请求这个功能,方法是使用一个叫 Accept-Encoding 的头部信息。

但是,urllib2 并不会设置这个头部信息,所以它收到的响应不会被压缩。你可以放心地获取资源,不用担心压缩的问题(不过因为不支持压缩,请求可能会花更多时间)。

153
  1. 我怎么知道一个网址上的数据是否经过了gzip压缩?

下面的代码可以用来检查内容是否经过gzip压缩,并且可以解压缩它:

from StringIO import StringIO
import gzip

request = urllib2.Request('http://example.com/')
request.add_header('Accept-encoding', 'gzip')
response = urllib2.urlopen(request)
if response.info().get('Content-Encoding') == 'gzip':
    buf = StringIO(response.read())
    f = gzip.GzipFile(fileobj=buf)
    data = f.read()
  1. urllib2会自动解压缩gzip压缩的数据吗?数据会一直是字符串吗?

不会。urllib2并不会自动解压缩数据,因为'Accept-Encoding'这个头信息不是由urllib2自动设置的,而是需要你手动添加,方法是使用:request.add_header('Accept-Encoding','gzip, deflate')

撰写回答