frabad
requêtes XPath avec Python
2013-02-21 11:34
New name
↓
↑
{tags:xml,python} {title:Requêtes XPath avec Python} [http://python.org/community/logos/python-powered-h-100x130.png|left]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|http://diveintopython3.net/] dans son [chapitre consacré à XML|http://diveintopython3.net/xml.html], dont est tiré la manipulation suivante. ---- ! Chargement de l'API (import) 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|http://effbot.org/zone/element-xpath.htm]). {{>>> import ElemenTree as etree}} ! Analyse (parse) # Invoquons ensuite la méthode `parse()` pour créer notre objet tree. {{>>> tree = etree.parse('http://diveintopython3.org/examples/feed.xml')}} # 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 XPath # Affectons d'abord l'espace de noms Atom à la constante NSMAP pour une réutilisation rapide.{{>>> NSMAP = {'atom': 'http://www.w3.org/2005/Atom'} }} # 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]}} ! Affichage 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']}}
Password
Summary of changes
Syntax
F]