0
Posted on 上午3:47:00 by Fan Zhang and filed under

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。

0
评论 : Python 3 中网页获取的长度问题

发表评论