urllib.urlretrieve的第三个参数是一个函数,文件总大小为-1
urllib.urlretrieve 这个函数有三个参数。第一个是已经传输的块的数量,第二个是每个块的大小(以字节为单位),第三个是文件的总大小。不过,文件的总大小有时候会返回 -1,比如下面这个例子:
def reportbook(a,b,c):
print "%.2f%%" % (100*a*b/c)
urllib.urlretrieve("http://www.baidu.com","files/baidu.html",reportbook)
在这个例子中,reportbook 是一个函数,c 是文件的总大小。c 返回 -1,但其实它不应该返回 -1。
这是不是不对呢?但在另一个例子中,它似乎是对的,当你使用
urllib.urlretrieve("http://www.python.org","files/baidu.html",reportbook)
时,c 返回了页面的实际总大小:549。
这是为什么呢?
2 个回答
1
你的代码没有问题,只是百度网站没有告诉你它会发送多少数据。这里有一个使用 wget
的例子:
$ wget "http://www.baidu.com"
--2014-07-30 16:29:26-- http://www.baidu.com/
Resolving www.baidu.com (www.baidu.com)... 220.181.111.188, 220.181.112.244
Connecting to www.baidu.com (www.baidu.com)|220.181.111.188|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Saving to: ‘index.html’
所以你应该单独处理一下特殊情况 c == -1
。
1
Baidu.com没有提供一个叫做Content-Length
的头信息,而Python.org是有的。如果这个Content-Length
头信息缺失,那么在报告钩子中会传递-1作为第三个参数。