Parser du XML en Python

Parser du XML en Python

Il peut arriver de vouloir parser du XML pour notamment les API SOAP qui utilisent ce format de données, les flux RSS ou encore pour récupérer les métadonnées des images vectorielles (format SVG). Nous allons voir dans cet article comment parser du XML en Python.

Contexte

On est jamais mieux servi que par soi-même non ? C'est sur ce dicton que je vais baser le contexte de cet article en utilisant le flux RSS de mon propre site web !

Pour rappel, un flux RSS est un format de données permettant de tenir au courant des mises à jour de contenu. Il permet de s'abonner à des sites web et de recevoir automatiquement les dernières actualités, articles, ou autres types de contenus publiés par ces sites. Ce format de données est représenté en XML, c'est pour cela que nous nous intéressons à cela.

L'URL de mon flux RSS est : https://dynops.fr/rss

On parse

Maintenant que nous avons le contexte, il est temps de passer au moment où l'on va parser ce flux RSS afin d'y récupérer certaines métadonnées. Notre premier objectif va être d'afficher le nom de mon site web.
Lorsque l'on affiche le flux RSS sur notre navigateur, ça donne ça :

On peut voir que le nom de mon site "DynOps" se trouve dans la balise XML <title> et dépend de deux balises : <rss> et <channel>. Analysons tout cela !

Tout d'abord, pour parser du XML en Python, il faut importer le module Python  lxml comme ceci  :

pip install lxml

Puis importons ce qu'il y a de nécessaire dans ce module :

from lxml import etree

Dans mon cas, je vais effectuer une requête HTTP GET sur mon site web. J'aurais besoin du module Python requests et je vais initialiser la variable contenant l'URL de mon flux RSS comme ceci :

from lxml import etree
import requests

rss_url = "https://dynops.fr/rss"

response = requests.get(rss_url)

J'aurais besoin de récupérer le réponse HTTP sous forme de flux brut d'octets. J'utilise donc la méthode .content en ajoutant ceci à mon code :

xml_content = response.content

Jusqu'ici, si la variable xml_content stocke le XML de mon flux RSS.

Le XPath

Abordons une nouvelle notion : le XPath. Il s'agit tout simplement du moyen d'identification d'une partie d'un fichier XML. Dans notre cas, l'arborescence pour le nom de mon site web correspond à ceci : /rss/channel/title.

Cela veut dire que l'on parcourt d'abord la balise rss puis channel et enfin title. Nous venons tout simplement de constituer notre XPath.

La suite serait donc d'identifier dans la partie du XML récupérée, le nom de mon site via son XPath comme ceci :

parsed_xml = etree.fromstring(xml_content)
get_title = parsed_xml.xpath("/rss/channel/title/text()")[0]

print(get_title)
Le résultat nous renvoie bien "DynOps" !

Maintenant, prenons un exemple où nous allons itérer sur plusieurs éléments : le nom de chacun de mes articles.

Le XPath correspondant au nom de mes articles correspond à :

get_articles_titles = parsed_xml.xpath("/rss/channel/item/title/text()")

Pour itérer dans tous ces articles, rien de plus simple qu'une boucle for comme celle-ci :

for article in get_articles_titles:
  print(article)

Cela vous renvoie le nom de mes articles ligne par ligne !

Voici le code Python au complet qui parse le XML de mon flux RSS et affiche le nom de mon site web :

from lxml import etree
import requests

rss_url = "https://dynops.fr/rss"

response = requests.get(rss_url)
xml_content = response.content

parsed_xml = etree.fromstring(xml_content)
get_title = parsed_xml.xpath("/rss/channel/title/text()")[0]

print(get_title)

get_articles_titles = parsed_xml.xpath("/rss/channel/item/title/text()")

for article in get_articles_titles:
  print(article)

Vous savez maintenant comment parser du XML en Python, il ne vous reste plus qu'à ajouter mon flux RSS en favori et le tour est joué !