Avec BeautifulSoup, comment obtenir les liens d'une page Web, les stocker dans une liste, puis en imprimer une? Voici ce que j'ai jusqu'à présent:

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("https://example.com/")
content = BeautifulSoup(html.read(), "html.parser")
for link in content.find_all("a"):
    print(link.get("href")[0])

Mais j'obtiens cette erreur: TypeError: 'NoneType' object is not subscriptable Comment puis-je résoudre ce problème et obtenir le premier lien?

1
Alen 24 févr. 2021 à 23:38

2 réponses

Meilleure réponse

Pour récupérer tous les liens d'une page, utilisez regex.

Le code suivant devrait le faire pour vous:

from urllib.request import urlopen
from bs4 import BeautifulSoup
import re

html = urlopen("https://www.stmaryottumwa.org/")
content = BeautifulSoup(html.read(), "html.parser")
links = []

for link in content.find_all("a", attrs={'href': re.compile("^http")}):
    links.append(link.get("href"))

print(links[0]) # print first link on page

Les liens variables contiendront tous les liens de la page.

2
0x435d2d 24 févr. 2021 à 21:09

Afin d'obtenir les attributs de l'élément, vous devez accéder au dict .attrs. Gardez également à l'esprit que parfois les balises a n'ont pas du tout d'attribut href, vous pouvez contourner cela en utilisant .get:

link.attrs.get('href')

Je ne suis pas sûr de ce que vous attendiez de [0] car une balise a ne peut avoir qu'un seul attribut href. L'utilisation de [0] vous permet d'obtenir le premier caractère de l'attribut href.

for link in content.find_all("a"):
    href = a.attrs.get('href')
    if href:
        print(href[0])
2
DeepSpace 24 févr. 2021 à 20:51