当我尝试使用此代码下载文件时:
import urllib
urllib.urlretrieve("http://e4ftl01.cr.usgs.gov/MOLT/MOD11A1.005/2012.07.11/MOD11A1.A2012193.h22v10.005.2012196013617.hdf","1.hdf")
文件已正确下载。
但我的目标是构建一个函数,根据文件名中的一些输入来下载文件。
网页上有很多文件。文件名的某些部分对于每个文件都是相同的(例如“/MOLT/MOD11A1.005/”),所以这不是问题。一些其他部分在一些明确定义的规则(例如“h22v10”)之后从一个文件更改为文件,并且我已经使用%s(例如h%sv%s)解决了这个问题,所以这也不是问题。问题是名称的某些部分在没有任何规则的情况下发生变化(例如“2012196013617”,)。名称的这些部分无关紧要,我想忽略这些部分。所以,我想下载名称中包含前两部分的文件(不改变的部分,以及根据规则更改的部分)以及其他任何内容。
我想,我可以在WHATEVER使用通配符,所以我尝试了这个:
import urllib
def download(url,date,h,v):
urllib.urlretrieve("%s/MOLT/MOD11A1.005/%s/MOD11A1.*.h%sv%s.005.*.hdf" %
(url, date1, h, v), "2.hdf")
download("http://e4ftl01.cr.usgs.gov", "2012.07.11", "22", "10")
这不会下载所请求的文件,而是生成一个错误文件,其中包含:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>Not Foun d</h1>
<p>The requested URL /MOLT/MOD11A1.005/2012.07.11/MOD11A1\*\h22v10.005\*\.hdf was not found on this server.</p >
</body>
</html>
看起来通配符不能与HTTP一起使用。你知道如何解决这个问题吗?
答案 0 :(得分:2)
问题是名称的某些部分在没有任何规则的情况下发生变化(例如“2012196013617”,)。名称的这些部分无关紧要,我想忽略这些部分
这是不可能的。 HTTP URL不支持“通配符”。您必须提供现有的网址。
答案 1 :(得分:0)
这是一个解决方案:这假设PartialName是一个带有文件名第一部分的字符串(尽可能多地知道并且是常量),URLtoSearch是可以找到文件的URL(也是一个字符串),并且FileExtension是“。ext”,“。mp3”,“。zip”等形式的字符串
def findURLFile(PartialName, URLtoSearch, FileExtension):
import urllib2
sourceURL = urllib2.urlopen(URLtoSearch)
readURL = sourceURL.read()
#find the first instance of PartialName and get the Index
#of the first character in the string (an integer)
fileIndexStart = readURL.find(PartialName)
#find the first instance of the file extension after the first
#instance of the string and add 4 to get past the extension
fileIndexEnd = readURL[fileIndexStart:].find(FileExtension) + 4
#get the filename
fileName = readURL[fileIndexStart:fileIndexStart+fileIndexEnd]
#stop reading the url -not sure if this is necessary
sourceURL.close()
#output the URL to download the file from
downloadURL = URLtoSearch + fileName
return downloadURL
我对编写python很新,这可能会受益于一些异常处理,也许还有一个while循环。它适用于我需要的东西,但我可能会改进代码并使其更优雅。