CodeGym /Cours /Python SELF FR /Extraction de données à partir des balises et attributs H...

Extraction de données à partir des balises et attributs HTML

Python SELF FR
Niveau 31 , Leçon 3
Disponible

1. Navigation dans l'arborescence HTML

Aujourd'hui, on va plonger dans le monde mystérieux des arborescences HTML et apprendre à extraire des infos des pages web comme de vrais ninjas du codage. On continue d'utiliser la magique bibliothèque BeautifulSoup pour aller jusqu'aux données nécessaires et rendre nos scripts déjà intelligents encore plus fonctionnels. Alors, prépare ton clavier et c'est parti !

Alors, avant de commencer à extraire des données, regardons de plus près ce qu'est une arborescence HTML. Imagine ça comme un gigantesque arbre généalogique, où chaque balise est un membre de la famille. Il y a les parents, les enfants, les frères et les sœurs. Notre mission, c'est de trouver des "membres" spécifiques pour récupérer leurs précieux trésors familiaux (ou plutôt, les données).

Voici à quoi peut ressembler un extrait d'HTML :

HTML

<div class="article">
    <h2 id="title">Titre</h2>
    <p class="content">Ceci est le texte d'un article...</p>
    <a href="https://example.com" class="link">Lire plus</a>
</div>

Ici, on a un div, qui est un élément parent pour h2, p, et a. Chacun possède ses attributs et son contenu.

2. Extraction de données par les balises

BeautifulSoup propose des méthodes pratiques pour naviguer dans l'arborescence et extraire des données. Commençons par la méthode de base find(), qui permet de trouver le premier élément avec une balise définie. Et find_all() est comme un bulldozer de recherche, qui déterre tous les éléments avec une balise donnée.

python
                      
                        from bs4 import BeautifulSoup
                
                        html_doc = """<div class="article">
                                        <h2 id="title">Titre</h2>
                                        <p class="content">Ceci est le texte d'un article...</p>
                                        <a href="https://example.com" class="link">Lire plus</a>
                                     </div>"""
                        
                        soup = BeautifulSoup(html_doc, 'html.parser')
                        
                        # Trouver le premier paragraphe
                        first_paragraph = soup.find('p')
                        print(first_paragraph.text)  # Sortie : Ceci est le texte d'un article...
                        
                        # Trouver tous les liens
                        all_links = soup.find_all('a')
                        for link in all_links:
                            print(link['href'])  # Sortie : https://example.com
                      
                    

3. Utilisation des attributs pour filtrer les éléments

Maintenant qu'on connaît la recherche par balises, il est temps d'apprendre à filtrer les éléments grâce à des attributs, comme id et class. Ces attributs sont comme des marque-pages sur une page, pour y voir plus clair.

HTML

<div class="article">
    <h2 id="title">Titre</h2>
    <p class="content">Ceci est le texte d'un article...</p>
    <a href="https://example.com" class="link">Lire plus</a>
</div>
Python

# Trouver un élément avec un id spécifique
title = soup.find(id="title")
print(title.text)  # Sortie : Titre

# Trouver tous les éléments avec la classe "content"
content_paragraphs = soup.find_all(class_="content")
for p in content_paragraphs:
    print(p.text)  # Sortie : Ceci est le texte d'un article...

Important ! On utilise class_ à la place de class, pour éviter un conflit avec le mot-clé réservé de Python.

4. Pratique d'extraction de données avec des conditions spécifiques

Maintenant, passons à la pratique ! Imagine que tu veux extraire les liens et les textes des titres d'un grand tableau HTML répétitif d'articles. Voici un exemple de données et comment les travailler :

HTML

<div class="articles">
    <div class="article">
        <h2 class="title">Premier article</h2>
        <a href="https://example.com/1" class="read-more">Lire plus</a>
    </div>
    <div class="article">
        <h2 class="title">Deuxième article</h2>
        <a href="https://example.com/2" class="read-more">Lire plus</a>
    </div>
</div>

Et voici comment on peut extraire les titres et les liens :

Python

html_doc = """<div class="articles">
                <div class="article">
                    <h2 class="title">Premier article</h2>
                    <a href="https://example.com/1" class="read-more">Lire plus</a>
                </div>
                <div class="article">
                    <h2 class="title">Deuxième article</h2>
                    <a href="https://example.com/2" class="read-more">Lire plus</a>
                </div>
              </div>"""

soup = BeautifulSoup(html_doc, 'html.parser')

articles = soup.find_all('div', class_='article')
for article in articles:
    title = article.find('h2', class_='title').text
    link = article.find('a', class_='read-more')['href']
    print(f"Titre : {title}, Lien : {link}")
    
# Sortie :
# Titre : Premier article, Lien : https://example.com/1
# Titre : Deuxième article, Lien : https://example.com/2

5. Attention aux pièges

Maintenant que tu es armé de connaissances, regardons quelques erreurs courantes. L'une des plus fréquentes est de tenter d'accéder à un attribut qui n'existe pas. Python répond avec un KeyError bien intentionné, mais parfois désagréable. Pour éviter cela, tu peux utiliser la méthode .get() pour obtenir des attributs avec une valeur par défaut, s'ils manquent.

En plus, n'oublie pas les éléments HTML qui peuvent être imbriqués et avoir une structure complexe. Utilise l'outil d'inspection du code source de la page dans le navigateur pour être sûr de bien comprendre la structure avant d'essayer d'extraire des données avec BeautifulSoup.

Prochaine étape dans notre aventure passionnante : l'application des sélecteurs CSS pour extraire encore plus précisément les infos. Alors reste dans les parages, parce que l'aventure dans le monde de BeautifulSoup ne fait que commencer !

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