2016-03-31 3 views
1

Ich habe einen FTP-Link, der einige Links zu Dateien enthält, die ich in das Herunterladen interessiert bin:Wie FTP-URLs herunterladen, die bestimmte Bedingungen erfüllen?

import urllib2 
import BeautifulSoup 

request = urllib2.Request("ftp://lidar.wustl.edu/Phelps_Rolla/") 
response = urllib2.urlopen(request) 
soup = BeautifulSoup.BeautifulSoup(response) 

>>> soup 
drwxrwxrwx 1 user  group   0 Nov 7 2012 . 
drwxrwxrwx 1 user  group   0 Nov 7 2012 .. 
drwxrwxrwx 1 user  group   0 Nov 7 2012 ESRI_Grids 
drwxrwxrwx 1 user  group   0 Nov 7 2012 ESRI_Shapefiles 
drwxrwxrwx 1 user  group   0 Nov 7 2012 LAS_Files 
-rw-rw-rw- 1 user  group  545700 May 27 2011 LiDAR Accuracy Report_Rolla.pdf 
drwxrwxrwx 1 user  group   0 Nov 7 2012 Rolla Survey 
-rw-rw-rw- 1 user  group  4865 May 26 2011 Rolla_SEMA_Tile_Index.dbf 
-rw-rw-rw- 1 user  group   503 May 26 2011 Rolla_SEMA_Tile_Index.prj 
-rw-rw-rw- 1 user  group   188 May 26 2011 Rolla_SEMA_Tile_Index.sbn 
-rw-rw-rw- 1 user  group   124 May 26 2011 Rolla_SEMA_Tile_Index.sbx 
-rw-rw-rw- 1 user  group  1100 May 26 2011 Rolla_SEMA_Tile_Index.shp 
-rw-rw-rw- 1 user  group  12682 May 31 2011 Rolla_SEMA_Tile_Index.shp.xml 
-rw-rw-rw- 1 user  group   140 May 26 2011 Rolla_SEMA_Tile_Index.shx 
:

ftp://lidar.wustl.edu/Phelps_Rolla/

ich folgendes alle URLs Liste kann mit


Wie kann ich nur die Links herunterladen, die con tain "Tile" oder "Kachel" mit den Erweiterungen ".dbf", ".prj", ".shp" und ".shx"?

Antwort

3

Sie verwenden Urllib ABD schöne Suppe, aber wenn Sie mit FTP spezialisiert Standard Bibliothek Modul ftplib ist wahrscheinlich die bessere Wahl. Gehe zu Docs und lies, wie man sich mit FTP verbindet und das Verbindungs- und Listenverzeichnis öffnet, es gibt dort einfache Durchgänge.

Der nächste Schritt ist herauszufinden, wie Sie Ihre Dateien filtern, das ist eine Angelegenheit einiger Listen Verständnis String-Strings zu denen, die einige Zeichenfolge innen, z. siehe this question oder this question. Schließlich müssen Sie googeln, wie Sie Dateien per FTP herunterladen, Sie will find this question. Stellt sich heraus, dass Dateidownloads mit einem Anruf ftp.retrbinary() gemacht werden. Hier

ist einfaches Skript, das alle Dinge tut ich oben erwähnt:

from ftplib import FTP 

ftp = FTP("lidar.wustl.edu") 
ftp.login() 
ftp.cwd("Phelps_Rolla") 
# list files with ftplib 
file_list = ftp.nlst() 

for f in file_list: 
    # apply your filters 
    if "tile" in f.lower() and any(f.endswith(ext) for ext in ['dbf', 'prj', 'shp', 'shx']): 
     # download file sending "RETR <name of file>" command 
     # open(f, "w").write is executed after RETR suceeds and returns file binary data 
     ftp.retrbinary("RETR {}".format(f), open(f, "wb").write) 
     print("downloaded {}".format(f)) 
ftp.quit()