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

Python urllib.urlretrieve的第三个参数是一个函数,文件的总大小为-1,python,web,Python,Web,urllib.urlretrieve的参数是一个函数。它有三个参数:到目前为止传输的块数、以字节为单位的块大小以及文件的总大小,但文件的总大小为return-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,

urllib.urlretrieve的参数是一个函数。它有三个参数:到目前为止传输的块数、以字节为单位的块大小以及文件的总大小,但文件的总大小为return-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


为什么?

Baidu.com没有提供
内容长度
标题。Python.org确实如此。如果
内容长度
标题缺失,那么-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’
$wget”http://www.baidu.com"
--2014-07-30 16:29:26--  http://www.baidu.com/
正在解析www.baidu.com(www.baidu.com)。。。220.181.111.188, 220.181.112.244
连接到www.baidu.com(www.baidu.com)| 220.181.111.188 |:80。。。有联系的。
HTTP请求已发送,正在等待响应。。。200行

长度:未指定[text/html]您对reportbook的调用没有函数的任何输入参数。欢迎使用堆栈溢出!堆栈溢出是一个问答网站。读者,比如你自己,会提出问题,而其他读者会试图回答。因此,它不是一个问题解决网站,也不是一个讨论论坛。你的帖子缺少一个关键元素:一个问题。您是否有特定的问题要问?@heinst reportbook是第三个参数,它将在建立网络连接时调用一次,之后在每次读取块后调用一次。因此它由urlretrieve自动创建。“第三个参数可能是-1,在旧的FTP服务器上,这些服务器不返回文件大小以响应检索请求。”可能也适用于不告诉文件大小的HTTP服务器。它是reporthook,而不是book:)@Jasper感谢您的提醒。代码是正确的,但python文档是reporthook。