Как предотвратить загрузку пустого pdf-файла при использовании get и запросов в Python? - PullRequest
0 голосов
/ 11 июля 2020

Я очищаю веб-сайт, доступный по этой ссылке , используя Beautiful Soup. Идея состоит в том, чтобы загрузить все href, содержащие строку .pdf, используя модуль get.

Приведенный ниже код демонстрирует процедуру и работает по назначению:

filename = 'new_name.pdf'
url_to_download_pdf='https://bradscholars.brad.ac.uk/https://www.brad.ac.uk/library/additional-help/bradford-scholars-faqs/digital_preservation_policy.pdf'
with open(filename, 'wb') as f:
    f.write(requests.get(url_to_download_pdf).content)

Однако есть случай, когда URL-адрес, такой как приведенный выше (т.е. переменная url_to_download_pdf), ведет на страницу Page not found. В результате загружается непригодный и нечитаемый PDF-файл.

Открытие файла с помощью pdf reader в Windows дает следующее предупреждение:

введите описание изображения здесь

Мне любопытно, есть ли способы избежать доступа и загрузки недопустимого файла pdf?

Ответы [ 3 ]

1 голос
/ 11 июля 2020

Вы должны подтвердить, что файл, который вы запрашиваете, уже существует. Если файл существует, код ответа запроса будет 200 . Вот пример того, как это сделать:

filename = 'new_name.pdf'
url_to_download_pdf='https://bradscholars.brad.ac.uk/https://www.brad.ac.uk/library/additional-help/bradford-scholars-faqs/digital_preservation_policy.pdf'
with open(filename, 'wb') as f:
    response = requests.get(url_to_download_pdf)
    if response.status_code == 200:
        f.write(response.content)
    else:
        print("Error, the file doesn't exist")
1 голос
/ 11 июля 2020

Спасибо за предложение пользователя.

Согласно @ Nicolas,

Сохраняйте как pdf, только если ответ возвращает 200

if response.status_code == 200:

В В предыдущей версии пустой файл будет создан независимо от ответа, потому что следующий with open(filename, 'wb') as f: был создан перед проверкой status_code

Чтобы смягчить это, with open(filename, 'wb') as f: должен запускаться только в том случае, если набор условий был таким, как задумано.

Полный код выглядит следующим образом:

import requests
filename = 'new_name.pdf'
url_to_download_pdf='https://bradscholars.brad.ac.uk/https://www.brad.ac.uk/library/additional-help/bradford-scholars-faqs/digital_preservation_policy.pdf'
my_req = requests.get(url_to_download_pdf)
if my_req.status_code == 200:
    with open(filename, 'wb') as f:
        f.write(my_req.content)
1 голос
/ 11 июля 2020

Вместо прямого доступа к содержимому файла с помощью f.write(requests.get(url_to_download_pdf).content)

Вы можете сначала проверить статус запроса, а затем, если это действительный запрос, сохранить только в файл.

filename = 'new_name.pdf'
url_to_download_pdf='https://bradscholars.brad.ac.uk/https://www.brad.ac.uk/library/additional-help/bradford-scholars-faqs/digital_preservation_policy.pdf'
response = requests.get(url_to_download_pdf)
if(response.status_code != 404):
    with open(filename, 'wb') as f:
        f.write(response.content)
...