1. Bases de travail avec des structures HTML complexes
Avant de plonger dans les structures HTML complexes, c’est important de comprendre pourquoi le HTML peut être si confus. Les développeurs web utilisent souvent des éléments imbriqués complexes pour organiser le contenu, ce qui peut devenir un véritable cauchemar pour ceux qui essaient d'extraire des données de ces pages. Mais ne t'inquiète pas — avec un bon plan et les bons outils, tu t’en sortiras sans problème !
Analyse de l'arbre HTML
Imagine un document HTML comme un arbre : chaque élément est
un nœud qui peut contenir du texte ou d'autres nœuds. Au sommet de cet arbre se trouve html
, suivi de
head
et body
, et ensuite viennent
différents éléments enfants. Les éléments imbriqués sont
plus profonds dans cet arbre.
Exemple d'une structure HTML simple :
<html>
<head>
<title>Exemple</title>
</head>
<body>
<div class="content">
<h1>Titre</h1>
<p>Paragraphe 1</p>
<p>Paragraphe 2</p>
<div class="nested">
<ul>
<li>Élément 1</li>
<li>Élément 2</li>
<li><span>Élément 3</span></li>
</ul>
</div>
</div>
</body>
</html>
Comme tu peux le voir, on a un div
avec la classe
nested
, qui contient ul
, qui à son tour
contient des li
. C'est un exemple
de comment les éléments peuvent être imbriqués.
2. BeautifulSoup
pour l'extraction des données
Extraction des données des éléments imbriqués
Souviens-toi de comment fonctionne BeautifulSoup. Utilisons
BeautifulSoup pour extraire le texte de la liste
li
. C’est le moment de jouer au détective et de récupérer
des données de nos structures imbriquées.
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
nested_items = soup.select('.nested ul li')
for item in nested_items:
print(item.get_text())
Résultat :
Élément 1
Élément 2
Élément 3
Comme tu peux le voir, on a utilisé la méthode select
avec
un sélecteur CSS pour trouver tous les li
à l'intérieur
de l'élément avec la classe nested
. La méthode
get_text()
permet d'extraire le texte
directement des éléments trouvés.
3. Travailler avec des éléments multiniveaux
Parfois, les données ne se trouvent pas seulement dans la profondeur de la structure, mais aussi réparties sur différents niveaux, ce qui rend la tâche d'extraction plus compliquée. Regardons comment extraire des données d’un arbre HTML plus complexe.
Exemple de structure complexe :
<html>
<body>
<div class="wrapper">
<div class="header">
<h1>Ceci est un titre</h1>
</div>
<div class="content">
<div class="article">
<h2>Article 1</h2>
<p>Contenu de l'article 1</p>
</div>
<div class="article">
<h2>Article 2</h2>
<p>Contenu de l'article 2</p>
</div>
</div>
<div class="footer">
<p>Informations de contact</p>
</div>
</div>
</body>
</html>
Extraction des données des niveaux
Maintenant, essayons d'extraire les titres de tous les articles et leur contenu.
articles = soup.select('.content .article')
for article in articles:
title = article.find('h2').get_text()
content = article.find('p').get_text()
print(f'Titre : {title}')
print(f'Contenu : {content}\n')
Sortie attendue :
Titre : Article 1
Contenu : Contenu de l'article 1
Titre : Article 2
Contenu : Contenu de l'article 2
On utilise une combinaison de méthodes select
et
find
pour atteindre nos objectifs.
select
aide à trouver l'élément parent, et
find
extrait l'info des enfants.
4. Particularités du travail avec des éléments imbriqués
En explorant les pages web, tu peux rencontrer des problèmes tels que la présence de plusieurs éléments imbriqués avec les mêmes classes ou balises. Dans ces cas, utiliser une recherche contextuelle et identifier clairement les éléments nécessaires t’aidera à éviter des erreurs.
Exemple de complexité d'imbrication :
<html>
<body>
<div class="container">
<div class="item">
<h2>Numéro 1</h2>
<div class="details">Détails 1</div>
</div>
<div class="item">
<h2>Numéro 2</h2>
<div class="details">Détails 2</div>
<div class="additional">
<div class="info">Info supplémentaire</div>
</div>
</div>
</div>
</body>
</html>
Extraction des données en tenant compte de l'imbrication
Pour éviter les confusions, il est nécessaire de trouver des éléments plus spécifiques :
items = soup.select('.container .item')
for item in items:
number = item.find('h2').get_text()
details = item.select_one('.details').get_text()
additional_info = item.select_one('.additional .info')
print(f'Numéro : {number}')
print(f'Détails : {details}')
if additional_info:
print(f'Info supplémentaire : {additional_info.get_text()}')
print()
Ici, on utilise la méthode select_one
, qui
retourne seulement le premier élément trouvé, pour éviter
la duplication des données des blocs supplémentaires.
5. Aspects pratiques et erreurs typiques
Travailler avec des structures HTML complexes peut être déroutant ou entraîner
des erreurs. Une des erreurs typiques est de tenter d'accéder à un élément
inexistant, ce qui entraîne une erreur AttributeError
. Pour éviter ça, vérifie
toujours l'existence de l'élément avant de travailler avec lui.
Une autre chose importante — c'est de comprendre qu’il ne faut pas toujours extraire les données d’un coup. Parfois, il est utile de faire une analyse préliminaire de la structure, en utilisant des sorties de débogage et en vérifiant les résultats intermédiaires.
Dans des projets réels, les compétences pour travailler avec des structures HTML imbriquées peuvent être cruciales. Ça s’applique non seulement au web scraping mais aussi aux tests des interfaces web, à l'automatisation des tests, et même à l’analyse des données des API complexes où la sortie peut avoir une réponse formatée et imbriquée.
GO TO FULL VERSION