0
Posted on 03:47:00 by Unknown and filed under
Python
2009-04-07Up: 更新到 Python 3.1a2,发现似乎问题解决了...
我在使用 urlopen(...).read() 读取某一个论坛网页的时候,发现获取的内容不全,最为奇怪的是,获取的内容是这个网页最后的部分。给我的感觉是分配给字符串的空间不够,导致读取超过长度限制的时候就把前面的"冲掉"了。但是 Python 的字符串是任意长的,不应该出现这个问题。
我用同一个程序尝试读取其他网页,包括相似的论坛都没有问题。同时,如果我设置一个很大的值,比如 read(100000),则也能完整读取这个网页。
后来我仔细查了一下 HTTP Headers,发现该网页 Response Headers 中有如下信息:
- Content-Encoding : gzip
- 没有 Transfer-Encoding : chunked 项
- 没有 Content-Length 域的值
- 有 Connection : Close 项
我不太懂 HTTP 协议是怎样规定的,我猜测因为这个网页的服务器没有告之文件大小,所以 Python 在读取的时候也无法预先得之大小,因此在读取的每次读一个新块就会把前一个覆盖。而当我指定一个读取大小时,Python 就会按照连接是否断开来判断是否读取结束。
以上是我的猜测,因为这个折腾了半天,也没有去查看源代码是如何实现的。希望有经验的朋友能告诉我对不对,多谢!
另外,使用标准库中的 urllib.request 应该能自动处理 gzip。
环境:Python 3.1a1。
发表评论