Effectuons une petite analyse (parsing) de document XML, sur lequel nous exécuterons des requêtes de nœuds. Nous ferons usage de l'API ElementTree et prendrons l'exemple de flux Atom fourni par Mark Pilgrim dans Dive Into Python 3 dans son chapitre consacré à XML, dont est tiré la manipulation suivante.
lxml
, entièrement compatible avec l'API ElementTree. Il nécessite cependant une installation séparée, décrite dans Python3 et lxml. >>> import lxml as etree
lxml
, importez le module ElementTree
et acceptez de travailler en mode limité(voir XPath Support in ElementTree).
>>> import ElemenTree as etree
parse()
pour créer notre objet tree. >>> tree = etree.parse('http://diveintopython3.org/examples/feed.xml')
>>> tree.getroot() <Element {http://www.w3.org/2005/Atom}feed at b752793c>En clair : l'élément
<feed>
, inscrit dans l'espace de noms http://www.w3.org/2005/Atom
a été trouvé à l'adresse b752793c. Fort bien, continuons.>>> NSMAP = {'atom': 'http://www.w3.org/2005/Atom'}
accessibility
>>> entries = tree.xpath("//atom:category[@term='accessibility']/..", namespaces=NSMAP)
Le premier argument passé à notre méthode est une requête XPATH. Elle sélectionnera chaque nœud dont l'élément fils <category>
contient un attribut term
de valeur égale à accessibility
. Chacun de ces nœuds est répertorié dans une entrée de liste. Retenons la première d'entre elles, à l'indice 0 :
>>> entry = entries[0]
<atom:title>
) de cette entrée. Il s'agit cette fois de sélectionner un nœud texte avec la fonction text()
:>>> entry.xpath('atom:title/text()', namespaces=NSMAP)
Et voici notre résultat final, éblouissant :
['Accessibility is a harsh mistress']