Passer au contenu

Comment transformer du HTML en texte en Python ?

Voici un article de blog de plus de 2000 mots sur « Comment transformer du HTML en texte en Python ? » :

HTML est un format important pour stocker et afficher des données sur le Web. Lors du web scraping, nous souhaitons souvent extraire uniquement le contenu textuel visible des pages HTML. Dans cet article, j'explorerai différentes techniques pour convertir du HTML en texte propre en Python.

Pourquoi convertir du HTML en texte ?

Il existe plusieurs raisons principales pour lesquelles vous souhaiterez peut-être supprimer les balises HTML et extraire uniquement le texte :

  • Simplifiez le contenu récupéré – Lors du scraping de pages Web, le HTML inclut généralement de nombreux balises supplémentaires et des éléments dont nous n'avons pas besoin, comme des liens de navigation. L'extraction du texte principal facilite l'analyse et l'utilisation du contenu.

  • Supprimer la mise en forme – HTML applique le formatage et la mise en page visuels. Pour de nombreuses applications telles que l’analyse des sentiments, nous souhaitons simplement le contenu du texte sans aucun formatage.

  • Stocker au format texte – Il peut être utile d’extraire uniquement le texte du HTML afin qu’il puisse être stocké dans un format simple comme un fichier texte ou dans un champ de texte de base de données. Cela supprime tout le balisage HTML volumineux.

  • lisibilité – Le HTML brut est difficile à lire et à interpréter pour les humains. La conversion en texte le rend plus lisible.

  • Accessibilité – Le contenu en texte brut est plus accessible aux lecteurs d’écran utilisés par les utilisateurs malvoyants.

  • Indexation des moteurs de recherche – Les moteurs de recherche analysent et indexent en grande partie le contenu textuel visible des pages. La conversion du HTML en texte peut aider à analyser le contenu de la même manière que les moteurs de recherche le voient.

En résumé, l’extraction de texte à partir de HTML est utile pour le scraping, l’analyse, le stockage et l’accessibilité. Les sections suivantes couvrent différentes manières d'y parvenir en Python.

Supprimer les balises HTML avec BeautifulSoup

Beautiful Soup est une bibliothèque Python populaire pour le scraping Web et l'analyse HTML. Nous pouvons l'utiliser pour extraire du texte du HTML assez facilement.

La méthode la plus simple consiste à appeler le get_text() méthode sur un objet BeautifulSoup ou un élément sélectionné dans le code HTML analysé. Par exemple:

from bs4 import BeautifulSoup

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>."""

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

text = soup.get_text()
print(text)

# Output: Here is a paragraph with a link.

Cela supprime toutes les balises HTML et renvoie une chaîne contenant le texte visible.

Une chose à noter est que get_text() par défaut, condensera également plusieurs caractères d'espacement consécutifs en un seul espace. Passer strip=False pour préserver les espaces comme les nouvelles lignes et les espaces supplémentaires :

text = soup.get_text(strip=False) 
print(text)

# Output: 
# 
# Here is a paragraph with  
#            a link.

Pour extraire le texte d'une partie seulement du code HTML, appelez get_text() sur un élément au lieu de l'ensemble du document :

el = soup.select_one("p")
text = el.get_text()
print(text)

# Output: Here is a paragraph with a link.

Une mise en garde est que get_text() inclura toujours tout texte imbriqué dans des éléments enfants comme des liens. Pour les supprimer également, passez un recursive=False argument:

text = el.get_text(recursive=False)
print(text) 

# Output: Here is a paragraph with 

Ainsi, avec BeautifulSoup, nous pouvons facilement utiliser get_text() pour extraire le texte visible du HTML.

Extraire du texte avec lxml

lxml est une autre bibliothèque Python populaire pour analyser XML et HTML. Nous pouvons également l'utiliser pour extraire du texte.

À partir d'un lxml HTMLParser élément, appelez l'élément text_content() méthode pour obtenir le texte:

from lxml.html import fromstring, HTMLParser

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

tree = fromstring(html, parser=HTMLParser())

text = tree.text_content() 
print(text)

# Output: Here is a paragraph with a link.

Cela extraira de manière récursive tout le texte, y compris les éléments enfants. Pour exclure le texte des enfants, transmettez un children=False argument:

text = tree.text_content(children=False)
print(text)

# Output: Here is a paragraph with 

Ainsi, lxml fournit également un moyen simple de supprimer le HTML et d'obtenir uniquement le contenu du texte.

Expressions régulières

Une approche basée sur les expressions régulières peut également être utilisée pour supprimer les balises HTML. Cela implique d'utiliser un modèle pour faire correspondre toutes les balises HTML, et des substitutions pour les remplacer par rien :

import re

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

clean = re.sub(r"<[^>]*>", "", html) 
print(clean)

# Output: Here is a paragraph with a link.

Le regex r"<[^>]*>" allumettes < suivi de n'importe quoi sauf > une ou plusieurs fois, suivi de >L’ re.sub() call supprime ces correspondances, supprimant ainsi toutes les balises HTML.

Pour gérer également les espaces de noms XML et les balises à fermeture automatique :

clean = re.sub(r"<[^>]+>", "", html)

Il s'agit d'une approche rapide et simple basée sur les expressions régulières pour supprimer toutes les balises HTML. Bien qu'il n'offre pas le même contrôle et la même simplicité que les bibliothèques d'analyse HTML spécifiques comme BeautifulSoup et lxml.

Gestion de l'encodage

Les pages Web peuvent être codées dans différents formats de texte comme ASCII, UTF-8 ou ISO-8859-1. Lors du scraping de pages, nous souhaitons détecter l'encodage et décoder correctement le texte Unicode.

Le chardet la bibliothèque peut détecter automatiquement l'encodage pour nous :

import chardet

html = b"<p>Hello world</p>"

encoding = chardet.detect(html)["encoding"]

if encoding:
    html = html.decode(encoding)
else:
    html = html.decode("utf-8") 

print(html)

Nous pouvons ensuite décoder explicitement les octets HTML en une chaîne Unicode avant d'analyser et d'extraire le texte.

Lors de la conversion de HTML en texte, l'encodage doit être traité avant toute analyse pour éviter les erreurs d'encodage.

Exemple HTML complet en texte

Voici un exemple rassemblant les étapes couvertes pour extraire de manière robuste du texte à partir de HTML :

from bs4 import BeautifulSoup
import chardet
import re

def html_to_text(html):
    # Detect encoding
    encoding = chardet.detect(html)["encoding"] 

    if encoding:
        html = html.decode(encoding)
    else:
        html = html.decode("utf-8")

    # Remove tags
    clean = re.sub(r"<[^>]+>", "", html)

    # Extract text
    soup = BeautifulSoup(clean, "html.parser")
    text = soup.get_text(strip=True)

    return text

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

print(html_to_text(html))

# Output: Here is a paragraph with a link.

Cela gère la détection de l'encodage, la suppression des balises et l'extraction du texte dans une fonction réutilisable.

Il existe également des bibliothèques Python comme texte qui encapsulent certaines de ces fonctionnalités pour convertir divers formats de fichiers en texte.

Conversion d'entités HTML

Un autre problème que nous pouvons rencontrer est le HTML utilisant des entités de caractères telles que   et les & au lieu de caractères littéraux.

Nous pouvons utiliser le html.unescape() fonction du standard de Python bibliothèque HTML pour reconvertir les entités en caractères :

import html

text = " Bread & Butter"

print(html.unescape(text))

# Output: Bread & Butter 

Cela peut être fait avant ou après l'extraction du texte du HTML.

Gestion de JavaScript

Une limitation des techniques ci-dessus est qu'elles extraient uniquement le texte visible du code HTML initial. Tout texte ajouté dynamiquement par JavaScript ne sera pas capturé.

Pour exécuter JavaScript et afficher le texte intégral, nous devons utiliser un navigateur sans tête comme Sélénium or Dramaturge:

from playwright.sync_api import sync_playwright

html = """<p>Hello</p><script>document.body.innerHTML += "<p>World</p>";</script>"""

with sync_playwright() as p:
    browser = p.webkit.launch()
    page = browser.new_page()
    page.content = html
    text = page.content()
    browser.close()

print(text)    
# Output: <p>Hello</p><p>World</p>

Ici, Playwright est utilisé pour charger la page et exécuter JavaScript, nous permettant d'extraire le texte complet.

Ainsi, pour les pages comportant de lourdes manipulations JS, un outil d'automatisation du navigateur peut être nécessaire si nous avons besoin du texte rendu complet.

Résumé

Il existe quelques techniques principales pour convertir du HTML en texte brut en Python :

  • Utilisez get_text() de BeautifulSoup
  • Extraire le contenu avec text_content() en lxml
  • Supprimer les balises à l'aide d'expressions régulières
  • Décodez tous les encodages avant l’analyse
  • Gérer les entités HTML avec html.unescape()
  • Utilisez un navigateur sans tête si JavaScript doit être exécuté

La conversion de HTML en texte est utile pour simplifier le contenu récupéré, analyser le texte au lieu du balisage, améliorer la lisibilité et l'accessibilité, l'indexation par les moteurs de recherche et le stockage dans un format léger.

J'espère que cet article a fourni un guide complet des principales méthodes d'extraction de texte HTML à l'aide de Python ! Faites-moi savoir si vous avez d'autres techniques utiles.

Prendre part à la conversation

Votre adresse email n'apparaitra pas. Les champs obligatoires sont marqués *