从HTTP下载具有复杂名称结构的文件

时间:2013-09-05 08:27:57

标签: 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.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一起使用。你知道如何解决这个问题吗?

2 个答案:

答案 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循环。它适用于我需要的东西,但我可能会改进代码并使其更优雅。