BeautifulSoup : scrappe le web et transforme le HTML en données propres

BeautifulSoup : scrappe le web et transforme le HTML en données propres

De quoi avez-vous besoin

Version de Python

3.x

Packages

  • {"nom": "beautifulsoup4", "version": "4.15.0"}

Difficulté

Débutant

Le web regorge de données utiles : des prix, des listes d'articles, des fiches produits, des avis. Le problème, c'est qu'elles sont coincées dans du HTML que personne n'a envie de lire à la main. BeautifulSoup est la bibliothèque Python qui déchiffre ce bazar et le transforme en données propres, prêtes à être enregistrées ou analysées.

Pas besoin d'API, pas besoin de navigateur. BeautifulSoup parse une page HTML et te laisse naviguer dedans comme dans un dictionnaire géant. Il ne télécharge rien lui-même : tu lui donnes le HTML brut, il s'occupe du reste. Dans ce tutoriel, tu vas scraper ton premier site en quelques minutes, avec du code que tu pourras copier-coller tel quel.

1. Installer BeautifulSoup

Une seule dépendance. BeautifulSoup s'installe avec pip et s'importe sous le nom bs4, un raccourci hérité des débuts du projet.

bash
pip install beautifulsoup4

2. Parser ta première page HTML

On commence avec un bout de HTML écrit à la main, pour comprendre la mécanique sans dépendre du réseau. BeautifulSoup(html, "html.parser") construit un objet soup qui contient tout l'arbre de la page. Le parser html.parser est intégré à Python : zéro dépendance supplémentaire.

python
from bs4 import BeautifulSoup

html = """
<h1 class="titre">Les coulisses d'un tuto IA</h1>
<p class="intro">Écrire, coder, publier.</p>
<ul>
  <li><a href="/python">Python</a></li>
  <li><a href="/ia">IA</a></li>
</ul>
"""

soup = BeautifulSoup(html, "html.parser")

Pour du HTML mal formé, comme celui qu'on croise sur de vrais sites, remplace "html.parser" par "lxml" après un pip install lxml. lxml est plus tolérant et plus rapide sur de grosses pages.

3. Naviguer dans le document

Une balise s'atteint comme un attribut : soup.h1 renvoie le premier h1 de la page. find() renvoie la première correspondance qui vérifie tes critères, find_all() la liste complète. Note le underscore de class_ : class est un mot réservé de Python, BeautifulSoup l'évite avec ce suffixe.

python
# Accès direct à une balise
print(soup.h1.text)                 # Les coulisses d'un tuto IA

# Première occurrence d'un paragraphe avec la classe "intro"
intro = soup.find("p", class_="intro")
print(intro.text)                   # Écrire, coder, publier.

# Tous les liens de la page
for lien in soup.find_all("a"):
    print(lien.text, "->", lien["href"])

.text extrait le texte brut sans les balises. Pour récupérer un attribut, on traite la balise comme un dictionnaire : lien["href"]. Si l'attribut peut manquer, préfère lien.get("href") pour éviter un plantage en pleine exécution.

4. Cibler avec les sélecteurs CSS

Si tu connais le CSS, select() est ton meilleur ami. Il accepte les classes, les ids, les hiérarchies, et select_one() renvoie le premier élément trouvé au lieu d'une liste.

python
titres = soup.select("h1.titre")
liens = soup.select("ul li a")
premier_lien = soup.select_one("ul li a")

5. Scraper un vrai site

Place au concret. On récupère une vraie page avec urllib, un module de la bibliothèque standard, puis on la parse. quotes.toscrape.com est un site conçu pour s'entraîner au scraping : on peut le marteler sans remords.

python
import urllib.request
from bs4 import BeautifulSoup

url = "https://quotes.toscrape.com/"
requete = urllib.request.Request(
    url, headers={"User-Agent": "Mozilla/5.0 (tutoriel iancr)"}
)
html = urllib.request.urlopen(requete).read()

soup = BeautifulSoup(html, "html.parser")
print(soup.title.string)            # Titre de la page

for citation in soup.select("div.quote"):
    texte = citation.select_one("span.text").text
    auteur = citation.select_one("small.author").text
    print(f"{texte}{auteur}")

Le script boucle sur chaque bloc div.quote, extrait le texte et l'auteur, et affiche dix citations propres. À toi de les écrire dans un fichier CSV ou une base de données, plutôt que de les laisser filer dans le terminal.

6. Scraper sans se faire bannir

Le scraping, c'est du savoir-vivre. Envoie toujours un User-Agent identifiable, espace tes requêtes, et respecte le robots.txt du site. Un petit time.sleep entre deux pages évite de faire tomber un serveur et de te faire bloquer ton adresse IP.

python
import time

for page in range(1, 4):
    url = f"https://quotes.toscrape.com/page/{page}/"
    # ... récupère et parse la page ...
    time.sleep(2)  # on laisse respirer le serveur

À toi de jouer

BeautifulSoup est le genre d'outil qu'on garde à vie dans sa boîte : léger, sans clé API, redoutable dès qu'une donnée traîne dans du HTML. La prochaine fois qu'un site te refuse une export, tu sauras te servir.

Un dernier conseil : vérifie toujours les conditions d'utilisation du site que tu scrapes. Consulter un site public pour un usage personnel, c'est raisonnable. Aspirer et revendre le contenu de quelqu'un, c'est une autre histoire.