Requêtes XPath avec Python Edit

2013-02-21 11:34
classé dans xml, python

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.


Chargement de l'API (import)Edit

Dans la console Python, importons les classes et méthodes de l'API ElementTree.
  • Utilisez de préférence le module 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
  • Si vous ne souhaitez/pouvez pas utiliser lxml, importez le module ElementTree et acceptez de travailler en mode limité (voir XPath Support in ElementTree).
    >>> import ElemenTree as etree

Analyse (parse)Edit

  1. Invoquons ensuite la méthode parse() pour créer notre objet tree.
    >>> tree = etree.parse('http://diveintopython3.org/examples/feed.xml')
  2. Effectuons un test du chargement du flux parsé en invoquant la racine de l'arbre 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.

Requêtes XPathEdit

  1. Affectons d'abord l'espace de noms Atom à la constante NSMAP pour une réutilisation rapide.
    >>> NSMAP = {'atom': 'http://www.w3.org/2005/Atom'} 
  2. Chargeons maintenant toutes les entrées du flux dont le terme est 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]

AffichageEdit

Enfin, à l'aide d'une dernière requête XPATH, affichons le titre (<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']

F]