Ich versuche, eine PDF-Datei von einer Website herunterzuladen und auf der Festplatte zu speichern. Meine Versuche schlagen entweder mit Codierungsfehlern fehl oder führen zu leeren PDFs.
In [1]: import requests
In [2]: url = 'http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf'
In [3]: response = requests.get(url)
In [4]: with open('/tmp/metadata.pdf', 'wb') as f:
...: f.write(response.text)
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
<ipython-input-4-4be915a4f032> in <module>()
1 with open('/tmp/metadata.pdf', 'wb') as f:
----> 2 f.write(response.text)
3
UnicodeEncodeError: 'ascii' codec can't encode characters in position 11-14: ordinal not in range(128)
In [5]: import codecs
In [6]: with codecs.open('/tmp/metadata.pdf', 'wb', encoding='utf8') as f:
...: f.write(response.text)
...:
Ich weiß, dass es sich um ein Codec-Problem handelt, aber ich kann es scheinbar nicht zum Laufen bringen.
quelle
In Python 3 finde ich, dass Pathlib der einfachste Weg ist, dies zu tun. Die Antwort von Request.content passt gut zu pathlibs write_bytes.
from pathlib import Path import requests filename = Path('metadata.pdf') url = 'http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf' response = requests.get(url) filename.write_bytes(response.content)
quelle
544
und die Datei ist kaputt, irgendwelche Ideen?Sie können urllib verwenden:
import urllib.request urllib.request.urlretrieve(url, "filename.pdf")
quelle
urlretrieve
stützt sich auf globale Einstellungen, um Anforderungsheader zu bestimmen, was es für einige Anwendungsfälle ungeeignet macht.Im Allgemeinen sollte dies in Python3 funktionieren:
import urllib.request .. urllib.request.get(url)
Denken Sie daran, dass urllib und urllib2 nach Python2 nicht richtig funktionieren.
Wenn in einigen mysteriösen Fällen Anfragen nicht funktionieren (ist bei mir passiert), können Sie auch versuchen, sie zu verwenden
Verbunden:
Hier ist eine anständige Erklärung / Lösung, um alle PDF-Dateien auf einer Webseite zu finden und herunterzuladen:
https://medium.com/@dementorwriter/notesdownloader-use-web-scraping-to-download-all-pdfs-with-python-511ea9f55e48
quelle
Bitte beachten Sie, dass ich ein Anfänger bin. Wenn meine Lösung falsch ist, können Sie sie gerne korrigieren und / oder mich informieren. Ich kann auch etwas Neues lernen.
Meine Lösung:
Ändern Sie den DownloadPath entsprechend an den Ort, an dem Ihre Datei gespeichert werden soll. Fühlen Sie sich frei, den absoluten Pfad auch für Ihre Verwendung zu verwenden.
Speichern Sie das Folgende als downloadFile.py.
Verwendung:
python downloadFile.py url-of-the-file-to-download new-file-name.extension
Denken Sie daran, eine Erweiterung hinzuzufügen!
Anwendungsbeispiel:
python downloadFile.py http://www.google.co.uk google.html
import requests import sys import os def downloadFile(url, fileName): with open(fileName, "wb") as file: response = requests.get(url) file.write(response.content) scriptPath = sys.path[0] downloadPath = os.path.join(scriptPath, '../Downloads/') url = sys.argv[1] fileName = sys.argv[2] print('path of the script: ' + scriptPath) print('downloading file to: ' + downloadPath) downloadFile(url, downloadPath + fileName) print('file downloaded...') print('exiting program...')
quelle
In Bezug auf die Antwort von Kevin, in einen Ordner zu schreiben
tmp
, sollte es so sein:with open('./tmp/metadata.pdf', 'wb') as f: f.write(response.content)
er hat
.
vor der adresse vergessen und natürlich sollte dein ordnertmp
schon angelegt seinquelle
tmp
, es war wie in der Frage von OP. 2- Das/tmp
Verzeichnis ist der tmp in Unix-Systemen, befindet sich unter/tmp
, no.