Проблема с загрузкой нескольких PDF-файлов - PullRequest
0 голосов
/ 24 октября 2019

После запуска следующего кода я не могу открыть загруженные файлы PDF. Даже если код был успешно выполнен, загруженные файлы PDF повреждены.

Сообщение об ошибке моего компьютера:

Невозможно открыть файл. он может быть поврежден или в формате, который Preview не распознает.

Почему они повреждены и как мне решить эту проблему?

import os
import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup

url = "https://github.com/sonhuytran/MIT8.01SC.2010F/tree/master/References/University%20Physics%20with%20Modern%20Physics%2C%2013th%20Edition%20Solutions%20Manual"

#If there is no such folder, the script will create one automatically
folder_location = r'/Users/rahelmizrahi/Desktop/ Physics_Solutions'
if not os.path.exists(folder_location):os.mkdir(folder_location)

response = requests.get(url)
soup= BeautifulSoup(response.text, "html.parser")     
for link in soup.select("a[href$='.pdf']"):

    filename = os.path.join(folder_location,link['href'].split('/')[-1])
    with open(filename, 'wb') as f:
        f.write(requests.get(urljoin(url,link['href'])).content) 

Ответы [ 3 ]

0 голосов
/ 24 октября 2019

Эта проблема заключается в том, что вы запрашиваете ссылку, находящуюся в github 'blob', когда вам нужна ссылка 'raw':

'/sonhuytran/MIT8.01SC.2010F/blob/master/References/University%20Physics%20with%20Modern%20Physics%2C%2013th%20Edition%20Solutions%20Manual/A01_YOUN6656_09_ISM_FM.pdf'

, но вы хотите:

'/sonhuytran/MIT8.01SC.2010F/raw/master/References/University%20Physics%20with%20Modern%20Physics%2C%2013th%20Edition%20Solutions%20Manual/A01_YOUN6656_09_ISM_FM.pdf'

Так что просто отрегулируйте это. Полный код ниже:

import os
import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup

url = "https://github.com/sonhuytran/MIT8.01SC.2010F/tree/master/References/University%20Physics%20with%20Modern%20Physics%2C%2013th%20Edition%20Solutions%20Manual"

#If there is no such folder, the script will create one automatically
folder_location = r'/Users/rahelmizrahi/Desktop/Physics_Solutions'
if not os.path.exists(folder_location):os.mkdir(folder_location)

response = requests.get(url)
soup= BeautifulSoup(response.text, "html.parser")     
for link in soup.select("a[href$='.pdf']"):
    pdf_link = link['href'].replace('blob','raw')
    pdf_file = requests.get('https://github.com' + pdf_link)
    filename = os.path.join(folder_location,link['href'].split('/')[-1])
    with open(filename, 'wb') as f:
        f.write(pdf_file.content)
0 голосов
/ 24 октября 2019

Мне пришлось использовать soup.select ("a [href $ =. Pdf]") (без внутренних кавычек), чтобы заставить его правильно выбирать ссылки.

После этого ваш скрипт работает,но: вы загружаете не PDF, а веб-страницу HTML! Попробуйте посетить один из URL-адресов: https://github.com/sonhuytran/MIT8.01SC.2010F/blob/master/References/University%20Physics%20with%20Modern%20Physics%2C%2013th%20Edition%20Solutions%20Manual/A01_YOUN6656_09_ISM_FM.pdf

Вам будет представлена ​​веб-страница GitHub, а не настоящий PDF-файл. Чтобы получить это, вам нужен «сырой» URL-адрес GitHub, который вы можете увидеть, наведя курсор на кнопку «Скачать»: https://github.com/sonhuytran/MIT8.01SC.2010F/raw/master/References/University%20Physics%20with%20Modern%20Physics%2C%2013th%20Edition%20Solutions%20Manual/A01_YOUN6656_09_ISM_FM.pdf

Итак, похоже, вам просто нужно заменить blob на raw в нужном месте, чтобы заставить его работать:

href = link['href']
href = href.replace('/blob/', '/raw/')
requests.get(urljoin(url,href).content)
0 голосов
/ 24 октября 2019

Проблема в том, что файл не закрывается должным образом после открытия / записи.
Просто добавьте f.close() в конце кода, чтобы сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...