分类: Python/Ruby
2011-08-14 14:30:31
朋友学习用python抓去网页,使用了python自带的urllib2,测试抓取搜狐首页:
1
2
3 | import urllib2 resp = urllib2.urlopen('') resp.read()
|
发现读取出来的内容,不是html代码,而是压缩过的内容。我跟他推荐了模块,问题自动解决。
查了一下httplib2的源码,对于经过压缩的内容,有一个内部方法自动进行解压缩操作(我加了几个换行,方便显示,此方法在httplib2的init.py中):
1 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | def _decompressContent(response, new_content): content = new_content try:
encoding = response.get('content-encoding', None)
if encoding in ['gzip', 'deflate']: if encoding == 'gzip':
content = gzip.GzipFile(
fileobj=StringIO.StringIO(new_content)).read() if encoding == 'deflate':
content = zlib.decompress(content) response['content-length'] = str(len(content)) # Record the historical presence of the encoding in a way the won't
# interfere. response['-content-encoding'] = response['content-encoding'] del response['content-encoding'] except IOError: content = "" raise FailedToDecompressContent(_("Content purported to be compressed
with %s but failed to decompress.") % response.get('content-encoding'),
response, content) return content
|
这里传入的两个参数,response其实是一个字典,存储了真正的response的header,new_content是从真正的response读取出来的内容。根据header中的content-encoding来判断内容是否经过压缩,采用的是deflate还是gzip压缩。如果是deflate压缩,直接用zlib进行解压;如果是gzip压缩过的,需要先用StringIO模拟成文件然后用gzip读取。
如果一定要用urllib2.urlopen来读取页面内容,可以参考httplib2的代码进行判断和解压,否则还是用建议用httplib2。