19 Stimmen

Python-Download ohne Angabe eines Dateinamens

Wie lade ich eine Datei mit Fortschrittsbericht mit Python herunter, ohne einen Dateinamen anzugeben?

Ich habe urllib.urlretrieve ausprobiert, aber ich muss anscheinend einen Dateinamen für die heruntergeladene Datei angeben, unter dem sie gespeichert werden soll.

So zum Beispiel:

Ich möchte das nicht liefern:

urllib.urlretrieve("http://www.mozilla.com/products/download.html?product=firefox-3.6.3&os=win&lang=en-US", "/tmp/firefox.exe")

nur dies:

urllib.urlretrieve("http://www.mozilla.com/products/download.html?product=firefox-3.6.3&os=win&lang=en-US", "/tmp/")

aber wenn ich das tue, erhalte ich diesen Fehler:

IOError: [Errno 21] Is a directory: '/tmp'

Auch nicht in der Lage, den Dateinamen von einer URL zu erhalten Beispiel:

http://www.mozilla.com/products/download.html?product=firefox-3.6.3&os=win&lang=en-US

35voto

Ivan Talalaev Punkte 5312

Hier ist ein vollständiger Weg, um es mit python3 und kein Dateiname in url angegeben zu tun:

from urllib.request import urlopen
from urllib.request import urlretrieve
import cgi

url = "http://cloud.ine.ru/s/JDbPr6W4QXnXKgo/download"
remotefile = urlopen(url)
blah = remotefile.info()['Content-Disposition']
value, params = cgi.parse_header(blah)
filename = params["filename"]
urlretrieve(url, filename)

Als Ergebnis sollten Sie erhalten cargo_live_animals_parrot.jpg Datei

12voto

teepark Punkte 1725

Bearbeitet, nachdem die Frage geklärt wurde...

urlparse.urlsplit nimmt die Url, die Sie öffnen, und zerlegt sie in ihre Bestandteile, dann können Sie die path Teil und verwenden Sie den letzten / -begrenzten Chunk als Dateinamen.

import urllib, urlparse

split = urlparse.urlsplit(url)
filename = "/tmp/" + split.path.split("/")[-1]
urllib.urlretrieve(url, filename)

2voto

sth Punkte 210180

Es gibt urlopen die ein dateiähnliches Objekt erzeugt, das zum Lesen der Daten verwendet werden kann, ohne sie in einer lokalen Datei zu speichern:

from urllib2 import urlopen

f = urlopen("http://example.com/")
for line in f:
  print len(line)
f.close()

(Ich bin mir nicht sicher, ob es das ist, wonach Sie fragen.)

2voto

Matt Anderson Punkte 18343

Die von Ihnen angegebene URL verweist nicht auf eine Datei. Es handelt sich um eine Weiterleitung zu einer Webseite, auf der ein Javascript ausgeführt wird, das Ihren Webbrowser veranlasst, die Datei herunterzuladen. Die tatsächliche Adresse, zu der mein Browser von der fraglichen URL weitergeleitet wurde (ein Mirror), lautet:

http://mozilla.mirrors.evolva.ro//firefox/releases/3.6.3/win32/en-US/Firefox%20Setup%203.6.3.exe

Ich glaube, dass es zwei Möglichkeiten gibt, wie Webserver den Namen der Datei für Downloads angeben;

  1. Das letzte Segment des URL-Pfads
  2. Le site Content-Disposition Kopfzeile, die einen anderen zu verwendenden Dateinamen angeben kann

Für die Datei, die Sie herunterladen möchten, benötigen Sie nur das letzte Pfadsegment der URL (aber unter Verwendung der tatsächlichen URL der Datei, nicht der Webseite, die die zu verwendende gespiegelte Datei auswählt). Aber für einige Downloads müssen Sie den zu verwendenden Dateinamen aus der Content-Disposition Kopfzeile.

1voto

Antony Hatchkins Punkte 28362

Ich endete mit

os.system('wget -P /tmp http://www.mozilla.com/products/download.html?'
          'product=firefox-3.6.3&os=win&lang=en-US')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X