1
votes

Problème lors du téléchargement de plusieurs PDF

Après avoir exécuté le code suivant, je ne parviens pas à ouvrir les fichiers PDF téléchargés. Même si le code s'est exécuté correctement, les fichiers PDF téléchargés sont endommagés.

Le message d'erreur de mon ordinateur est

Impossible d'ouvrir le fichier. il est peut-être endommagé ou dans un format que Preview ne reconnaît pas.

Pourquoi sont-ils endommagés et comment résoudre ce problème?

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) 


0 commentaires

3 Réponses :


1
votes

Le problème est que le fichier n'est pas correctement fermé après l'ouverture / l'écriture.
Ajoutez simplement f.close () à la fin du code pour le faire.


0 commentaires

1
votes

Ce problème est que vous demandez le lien qui se trouve dans github 'blob' lorsque vous avez besoin du lien 'raw' :

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)

mais vous voulez:

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

Alors ajustez cela. Code complet ci-dessous:

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


0 commentaires

1
votes

J'ai dû utiliser soup.select ("a [href $ =. pdf]") (sans les guillemets intérieurs) pour qu'il sélectionne correctement les liens.

Après cela, votre script fonctionne, mais: quoi que vous téléchargez n'est pas un PDF, mais une page Web HTML! Essayez de visiter l'une des URL: https://github.com/sonhuytran/MIT8.01SC.2010F/blob/master/References/University%20Physics%20with%20Modern%2201%20Physics % 20Edition% 20Solutions% 20Manual / A01_YOUN6656_09_ISM_FM.pdf

Une page Web GitHub vous sera présentée, pas le PDF réel. Pour l'obtenir, vous avez besoin de l'URL GitHub "brute", que vous pouvez voir lorsque vous passez la souris sur le bouton Télécharger: https://github.com/sonhuytran/MIT8.01SC.2010 /master/References/University%20Physics%20with%20Modern%20Physics%2C%2013th%20Edition%20Solutions%20Manual/A01_YOUN6656_09_ISM_FM.pdf

Il semble donc que vous ayez juste à remplacer blob avec raw au bon endroit pour le faire fonctionner:

href = link['href']
href = href.replace('/blob/', '/raw/')
requests.get(urljoin(url,href).content)


0 commentaires