即使远程http服务器上不存在该文件,urllib.urlretrieve也会静默返回,它只是将一个html页面保存到指定的文件中。例如:
urllib.urlretrieve('http://google.com/abc.jpg', 'abc.jpg')只是静默地返回,即使google.com服务器上不存在abc.jpg,生成的abc.jpg也不是一个有效的jpg文件,它实际上是一个html页面。我猜返回的headers (一个httplib.HTTPMessage实例)可以用来实际判断检索是否成功,但是我找不到httplib.HTTPMessage的任何文档。
有人能提供一些关于这个问题的信息吗?
发布于 2009-06-12 18:46:05
在您的情况下,如果可能,请考虑使用urllib2。它比urllib更高级,更易于使用。
您可以轻松检测到任何HTTP错误:
>>> import urllib2
>>> resp = urllib2.urlopen("http://google.com/abc.jpg")
Traceback (most recent call last):
<<MANY LINES SKIPPED>>
urllib2.HTTPError: HTTP Error 404: Not Foundresp实际上是一个HTTPResponse对象,您可以使用它做很多有用的事情:
>>> resp = urllib2.urlopen("http://google.com/")
>>> resp.code
200
>>> resp.headers["content-type"]
'text/html; charset=windows-1251'
>>> resp.read()
"<<ACTUAL HTML>>"发布于 2012-03-17 00:02:07
我让它保持简单:
# Simple downloading with progress indicator, by Cees Timmerman, 16mar12.
import urllib2
remote = r"http://some.big.file"
local = r"c:\downloads\bigfile.dat"
u = urllib2.urlopen(remote)
h = u.info()
totalSize = int(h["Content-Length"])
print "Downloading %s bytes..." % totalSize,
fp = open(local, 'wb')
blockSize = 8192 #100000 # urllib.urlretrieve uses 8192
count = 0
while True:
chunk = u.read(blockSize)
if not chunk: break
fp.write(chunk)
count += 1
if totalSize > 0:
percent = int(count * blockSize * 100 / totalSize)
if percent > 100: percent = 100
print "%2d%%" % percent,
if percent < 100:
print "\b\b\b\b\b", # Erase "NN% "
else:
print "Done."
fp.flush()
fp.close()
if not totalSize:
print发布于 2009-06-12 17:21:43
根据文档,is是undocumented
要访问该消息,看起来您需要执行以下操作:
a, b=urllib.urlretrieve('http://google.com/abc.jpg', r'c:\abc.jpg')B是消息实例
因为我已经了解到Python,所以在我输入时使用Python的内省功能总是很有用的
dir(b) 我看到有很多方法或函数可供使用
然后我开始用b做一些事情
例如
b.items()列出了许多有趣的东西,我怀疑尝试这些东西会让你得到你想要操作的属性。
很抱歉,这是一个初学者的答案,但我正在尝试掌握如何使用内省能力来提高我的学习,而你的问题刚刚弹出。
我尝试了一些与此相关的有趣的东西-我想知道我是否可以自动从目录中显示的每个不需要参数的东西中获得输出,所以我写道:
needparam=[]
for each in dir(b):
x='b.'+each+'()'
try:
eval(x)
print x
except:
needparam.append(x)https://stackoverflow.com/questions/987876
复制相似问题