Python 从HTTP下载具有复杂名称结构的文件
当我尝试使用以下代码下载文件时:Python 从HTTP下载具有复杂名称结构的文件,python,http,wildcard,Python,Http,Wildcard,当我尝试使用以下代码下载文件时: 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.
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”)。名称的这些部分并不重要,我想忽略这些部分。因此,我想下载文件,其名称包含前两部分(不改变的部分和根据规则改变的部分)以及其他内容
我想,我可以用通配符来做任何事情,所以我尝试了以下方法:
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>
404找不到
不足为奇
在此服务器上找不到请求的URL/MOLT/MOD11A1.005/2012.07.11/MOD11A1\*\h22v10.005\*\\\\\\.hdf。
看起来通配符不适用于HTTP。你知道怎么解决这个问题吗
问题是名称的某些部分在没有任何规则的情况下发生了更改(例如“2012196013617”)。名称的这些部分并不重要,我想忽略这些部分
这是不可能的。HTTP URL不支持“通配符”。您必须提供一个现有URL。这里有一个解决方案:假设PartialName是一个带有文件名第一部分的字符串(尽可能多且不变),URLtoSearch是可以找到文件的URL(也是一个字符串),而FileExtension是一个格式为“.ext”、“.mp3”、“.zip”等的字符串
我对编写python代码相当陌生,这可能得益于一些异常处理和一个while循环。它可以满足我的需要,但我可能会改进代码,使其更加优雅。所以,根本没有办法解决这个问题?“您必须提供现有URL”是什么意思?您不能使用小丑/通配符。HTTP不支持调用
www.s*e.com/x*y
。提供一个真实的URL。@Ardit Sulce:不。根据这一点,这是行不通的,但您可以使用list命令获取文件列表,并使用Python对其进行筛选。这个答案并不是很有用。虽然HTTP不支持通配符,但是有一些工具可以实现OP想要的功能,例如wget。问题是Python中是否有这样的库。。。
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