urllib.urlretrieve的第三个参数是一个函数,文件总大小为-1

0 投票
2 回答
510 浏览
提问于 2025-04-18 15:20

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作为第三个参数。

撰写回答