Gérer des données html avec la bibliothèque lxml

La bibliothèque lxml de Python facilite la gestion des fichiers XML et HTML, et peut également être utilisée pour le Web scraping. Cette bibliothèque est facile à utiliser, rapide avec les documents volumineux, très bien documentée et permet une conversion facile des données, ce qui facilite la manipulation des fichiers.

la bibliothèque lxml

Nous allons utiliser un gestionnaire de packages Python pip pour installer la bibliothèque lxml. N’oubliez pas d’utiliser un environnement virtuel pour ne pas surcharger votre système et éviter des conflits de dépendances.

(venv)  >>> henke~/monProjet$ pip3 install lxml

Création d’éléments HTML avec la bibliothèque lxml

Il est possible de créer des éléments HTML en utilisant lxml, les éléments sont également appelés des nœuds. Créons la structure de base d’une page HTML en utilisant uniquement la bibliothèque :

from lxml import etree

root_elem = etree.Element('html', version="5.0")
etree.SubElement(root_elem, 'head')
etree.SubElement(root_elem, 'title')
etree.SubElement(root_elem, 'body')
print(etree.tostring(root_elem, pretty_print=True).decode("utf-8"))

En utilisant le module etree nous allons créer des éléments XML / HTML et leurs sous-éléments.
L’exécution du code vous donne une structure html basique contenant l’arborescence que nous avons défini.

<html version="5.0">
  <head/>
  <title/>
  <body/>
</html>

root_elem est notre objet racine.
Nous avons utilisé deux fonctions Element() pour créer un élément et SubElement() pour créer un élément enfant.
L’instruction pretty_print permet d’afficher une version indentée du document HTML.

Ces éléments HTML sont sous forme de liste. Donc, nous pouvons accéder à chaque élément avec son indice.

Pour ajouter un attribut à un élément, nous ajoutons un paramètre supplémentaire à la fonction SubElement() et spécifiez votre attribut sous la forme attributeName='attribute value'.

from lxml import etree

html_elem = etree.Element("html", lang="fr")
print(etree.tostring(html_elem))
b'<html lang="fr"/>'

pour accéder à ces attributs :

print(html_elem.get("lang"))
fr

De plus nous pouvons définir les attributs d’un élément HTML.

html_elem.set("apprendre", "Avec Pythonforge")
print(html_elem.get("apprendre"))
Avec Pythonforge

Exploiter des documents HTML / XML avec la bibliothèque lxml

Supposons que nous avons un fichier HTML ou XML que nous souhaitons exploiter pour extraire certaines informations. Prenons le fichier HTML que nous avons créé dans le premier exemple, essayons d’obtenir le nom de balise d’un élément spécifique, puis affichons les noms de balises de tous les éléments.

print(root_elem.tag)
html

Parcourir tous les éléments enfants de la racine et afficher leurs balises.

for x in root_elem:
    print(x.tag)
head
title
body

Récupération du texte à partir des éléments

À présent, nous allons faire des choses plus intéressantes avec nos fichiers HTML et XML. Presque toujours, ces fichiers contiennent du texte entre des balises. Ajoutons du texte à nos éléments :

from lxml import etree

root_elem = etree.Element('html', version="5.0")
etree.SubElement(root_elem, 'head')
etree.SubElement(root_elem, 'title')
etree.SubElement(root_elem, 'body')

# Ajouter du texte aux éléments et sous-éléments
root_elem.text = "Un fichier HTML"
root_elem[0].text = "La balise head"
root_elem[1].text = "La balise title"
root_elem[2].text = "La balise body"

print(etree.tostring(root_elem, pretty_print=True).decode("utf-8"))

L’exécution du code.

<html version="5.0">Un fichier HTML<head>La balise head</head><title>La balise title</title><body>La balise body</body></html>

Vérifier si un élément possède des enfants ou des parents

Il faut vérifier si oui ou non un élément possède des enfants, puis si oui ou non un nœud est un Element.

Commençons avec les nœuds.

if len(root) > 0:
    print("True")
else:
    print("False")

Ce code affichera True car le nœud racine contient des nœuds enfants.

Vérifier si chaque nœud est un Element.

for i in range(len(root_elem)):
    print(etree.iselement(root_elem[i]))
True
True
True

Vérifier si un élément a un parent.

print(root_elem.getparent())
print(root_elem[0].getparent())
print(root_elem[1].getparent())
None
<Element html at 0x7f0e35bb8c80>
<Element html at 0x7f0e35bb8c80>

La première ligne renvoie (None) car le nœud racine lui-même n’a pas de parent. Quant aux deux autres, elles pointent vers l’élément racine, c’est-à-dire la balise HTML.

Récupérer les frères et sœurs dans l’arborescence

Nous utiliserons les fonctions : getnext() et getprevious().

print(root_elem[1].getnext()) # avant "title"
print(root_elem[1].getprevious()) # après "title"
<Element body at 0x7f0e9df89340>
<Element head at 0x7f0e9df892c0>

Analyser des données XML à partir d’une chaîne de caractère

Nous pouvons fournir des données XML directement à l’objet etree et les analyser.

from lxml import etree

html = etree.XML('<html><head>L\'entete de la page</head><title>Le titre</title><body>Le contenu de la page</body></html>')
print(etree.tostring(html, pretty_print=True).decode('utf-8'))

L’exécution du code.

<html>
  <head>L'entete de la page</head>
  <title>Le titre</title>
  <body>Le contenu de la page</body>
</html>

Rechercher des éléments avec la bibliothèque lxml

Lors de l’analyse des fichiers XML et HTML, il est possible de vérifier si un Element possède un type particulier d’enfants. C’est utile si nous avons besoin de récupérer les lien sur une page Web particulière.

print(root_elem.find('a')) # La balise <a> représente les liens.
print(root_elem.find('head').tag)
print(root_elem.findtext('title')) # Renvoie le text de la balise title
None
head

Nous avons exploré différentes fonctionnalités qui pourraient nous aider à parcourir l’arborescence HTML / XML. Aussi, nous avons vu comment récupérer des éléments et des informations dans une arborescence. Ce qui pourrait vous aider dans vos futurs projets.

Gérer des données html avec la bibliothèque lxml

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Retour en haut