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.
pip install beautifulsoup42. 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.
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.
# 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.
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.
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.
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.






