Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从HTTP下载具有复杂名称结构的文件_Python_Http_Wildcard - Fatal编程技术网

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