CodeGym /Cours Java /Python SELF FR /Extraction de données à partir de structures HTML complex...

Extraction de données à partir de structures HTML complexes

Python SELF FR
Niveau 34 , Leçon 0
Disponible

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

<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.

Python

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

<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.

Python

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

<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 :

Python

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.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION