Próbuję pobrać plik PDF ze strony internetowej i zapisać go na dysku. Moje próby kończą się niepowodzeniem z błędami kodowania lub kończą się pustymi plikami PDF.
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)
...:
Wiem, że to jakiś problem z kodekiem, ale nie mogę go uruchomić.
W Pythonie 3 uważam, że pathlib jest najłatwiejszym sposobem na zrobienie tego. Request's response.content ładnie łączy się z wartością write_bytes pathlib.
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)
źródło
544
i plik jest uszkodzony, jakieś pomysły?Możesz użyć urllib:
import urllib.request urllib.request.urlretrieve(url, "filename.pdf")
źródło
urlretrieve
opiera się na ustawieniach globalnych w celu określenia nagłówków żądań, co czyni go nieodpowiednim w niektórych przypadkach użycia.Generalnie powinno to działać w Pythonie3:
import urllib.request .. urllib.request.get(url)
Pamiętaj, że urllib i urllib2 nie działają poprawnie po Pythonie2.
Jeśli w jakichś tajemniczych przypadkach prośby nie działają (zdarzyło mi się), możesz również spróbować użyć
Związane z:
Oto przyzwoite wyjaśnienie / rozwiązanie, aby znaleźć i pobrać wszystkie pliki PDF na stronie internetowej:
https://medium.com/@dementorwriter/notesdownloader-use-web-scraping-to-download-all-pdfs-with-python-511ea9f55e48
źródło
Pamiętaj, że jestem początkującym. Jeśli moje rozwiązanie jest błędne, popraw je i / lub daj mi znać. Mogę się też nauczyć czegoś nowego.
Moje rozwiązanie:
Zmień ścieżkę pobierania odpowiednio do miejsca, w którym chcesz zapisać plik. Nie krępuj się używać ścieżki bezwzględnej również do użytku.
Zapisz poniższy plik jako downloadFile.py.
Stosowanie:
python downloadFile.py url-of-the-file-to-download new-file-name.extension
Pamiętaj, aby dodać rozszerzenie!
Przykładowe użycie:
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...')
źródło
jeśli chodzi o odpowiedź Kevina na pisanie w folderze
tmp
, powinno wyglądać tak:with open('./tmp/metadata.pdf', 'wb') as f: f.write(response.content)
Zapomniał
.
wcześniej o adresie i oczywiście twój foldertmp
powinien już zostać utworzonyźródło
tmp
, to było jak w pytaniu OP. 2-/tmp
katalog to tmp w systemach uniksowych, zlokalizowany pod adresem/tmp
, no.