Parser du XML en Python, c’est souvent plus simple qu’on ne le pense. Le problème vient rarement du code lui-même, mais du choix de la bonne bibliothèque et de la bonne méthode selon le fichier à traiter. Cet article vous guide pas à pas pour parse XML using Python avec les outils adaptés, sans passer trois heures dans la documentation officielle.
Pourquoi ElementTree suffit pour parser du XML en Python dans la plupart des cas
Vous avez un fichier de configuration local, un export de données ou un flux RSS à lire ? Le module xml.etree.ElementTree fait partie de la bibliothèque standard de Python. Rien à installer, rien à configurer.
Voici le minimum pour charger un fichier XML et en extraire des données :
import xml.etree.ElementTree as ETtree = ET.parse('fichier.xml')root = tree.getroot()
Trois lignes. root contient maintenant la racine du document. Chaque balise devient un objet Python avec un nom (.tag), du texte (.text) et des attributs (.attrib).
Pour parcourir les enfants directs, une simple boucle suffit :
for child in root: print(child.tag, child.text)
Vous cherchez un élément précis dans l’arbre ? Les méthodes find() et findall() acceptent des expressions XPath simplifiées. Par exemple, root.findall('.//item') récupère tous les éléments item, quel que soit leur niveau d’imbrication.
Ce module couvre la grande majorité des besoins courants. Passez à autre chose uniquement quand vous touchez ses limites.

Parser du XML externe : le piège de sécurité que la doc mentionne à peine
Vous récupérez du XML depuis une API, un formulaire utilisateur ou un service web ? Le module ElementTree standard ne protège pas contre certaines attaques connues.
Deux menaces reviennent systématiquement :
- Les entités externes XML (XXE), qui permettent à un fichier XML malicieux de lire des fichiers sur votre serveur ou de déclencher des requêtes réseau non souhaitées.
- L’attaque dite « billion laughs », où un XML de quelques lignes se décompresse en une quantité de données suffisante pour saturer la mémoire.
- Des requêtes XPath avec certains prédicats d’index qui peuvent provoquer une consommation CPU disproportionnée sur du XML non fiable.
La parade est simple : utilisez la bibliothèque defusedxml pour tout XML qui ne vient pas de vos propres fichiers. Elle fournit des remplacements directs des parseurs standards, avec les protections activées par défaut.
from defusedxml.ElementTree import parsetree = parse('fichier_externe.xml')
Le code reste quasi identique. Seul l’import change. Pour des fichiers de configuration locaux que vous contrôlez, ElementTree standard reste adapté.
Quand lxml devient le bon choix pour parser du XML complexe
ElementTree a une limite claire : son support XPath est partiel. Si votre fichier XML utilise des espaces de noms (namespaces) imbriqués, ou si vous devez écrire des requêtes XPath avancées avec des axes (ancestor::, following-sibling::), vous allez vite tourner en rond.
C’est là que lxml prend le relais. Cette bibliothèque externe expose une API compatible avec ElementTree, mais repose sur les bibliothèques C libxml2 et libxslt. Le gain est double : requêtes XPath complètes et performances nettement meilleures sur les gros fichiers.
from lxml import etreetree = etree.parse('gros_fichier.xml')resultats = tree.xpath('//ns:produit[@stock>0]', namespaces={'ns': 'http://exemple.com/ns'})
Vous remarquez que la gestion des namespaces passe par un dictionnaire explicite. C’est le point qui bloque le plus souvent les débutants. Avec ElementTree standard, il faut préfixer chaque recherche avec l’URI du namespace entre accolades ({http://exemple.com/ns}produit). Avec lxml, le dictionnaire rend la syntaxe plus lisible.
En contrepartie, lxml doit être installé (pip install lxml) et dépend de bibliothèques C compilées. Sur certains environnements restreints, cette dépendance pose problème.

Transformer du XML en dictionnaire Python avec xmltodict
Vous n’avez pas besoin de naviguer dans un arbre ? Vous voulez juste convertir un fichier XML en structure Python exploitable comme du JSON ? La bibliothèque xmltodict fait exactement cela.
import xmltodictwith open('fichier.xml') as f: doc = xmltodict.parse(f.read())
Le résultat est un dictionnaire Python classique. Chaque balise devient une clé, chaque texte devient une valeur. Les attributs sont préfixés par @.
xmltodict convient parfaitement quand le XML est une simple enveloppe autour de données tabulaires. Par contre, dès que la structure est profondément imbriquée ou que vous devez filtrer des éléments précis, vous perdez la puissance des requêtes XPath. C’est un outil de conversion, pas de navigation.
Choisir la bonne bibliothèque pour parse XML using Python : critères concrets
Plutôt qu’un tableau comparatif abstrait, posez-vous ces questions dans l’ordre :
- Le XML vient-il d’une source que vous contrôlez (fichier local, export interne) ? Si oui, ElementTree standard suffit.
- Le XML provient d’un utilisateur, d’une API externe ou du web ? Passez par
defusedxmlpour neutraliser les vecteurs d’attaque courants. - Vous devez écrire des requêtes XPath complexes ou gérer des namespaces multiples ? Installez
lxml. - Vous voulez simplement convertir du XML en dictionnaire pour le traiter comme du JSON ?
xmltodictfait le travail en trois lignes.
La majorité des scripts Python qui traitent du XML n’ont besoin que d’ElementTree. Ajouter une dépendance se justifie par un besoin précis, pas par habitude.
Un dernier point sur les espaces de noms
Les namespaces XML sont la source d’erreur la plus fréquente chez les développeurs qui débutent avec le parsing. Un findall('produit') qui ne renvoie rien alors que le fichier contient des balises <produit>, c’est presque toujours un namespace non pris en compte.
Avec ElementTree, la syntaxe impose d’écrire le namespace complet : root.findall('{http://exemple.com/ns}produit'). Avec lxml, vous passez par un dictionnaire de préfixes. Dans les deux cas, vérifiez toujours la racine du fichier XML pour repérer les déclarations xmlns avant d’écrire vos requêtes.
Le parsing XML en Python ne demande ni framework lourd ni configuration complexe. Un import, trois lignes de code, et la bonne bibliothèque selon votre contexte : c’est tout ce qu’il faut pour extraire des données structurées sans se perdre.

