comment puis-je utiliser le vide des espaces de noms dans un lxml requête xpath?
J'ai un document xml dans le format suivant:
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:gsa="http://schemas.google.com/gsa/2007">
...
<entry>
<id>https://ip.ad.dr.ess:8000/feeds/diagnostics/smb://ip.ad.dr.ess/path/to/file</id>
<updated>2011-11-07T21:32:39.795Z</updated>
<app:edited xmlns:app="http://purl.org/atom/app#">2011-11-07T21:32:39.795Z</app:edited>
<link rel="self" type="application/atom+xml" href="https://ip.ad.dr.ess:8000/feeds/diagnostics"/>
<link rel="edit" type="application/atom+xml" href="https://ip.ad.dr.ess:8000/feeds/diagnostics"/>
<gsa:content name="entryID">smb://ip.ad.dr.ess/path/to/directory</gsa:content>
<gsa:content name="numCrawledURLs">7</gsa:content>
<gsa:content name="numExcludedURLs">0</gsa:content>
<gsa:content name="type">DirectoryContentData</gsa:content>
<gsa:content name="numRetrievalErrors">0</gsa:content>
</entry>
<entry>
...
</entry>
...
</feed>
J'ai besoin de récupérer tous les entry
éléments à l'aide de xpath dans lxml. Mon problème est que je ne peux pas comprendre comment utiliser un espace de noms vide. J'ai essayé les exemples suivants, mais aucun travail. Veuillez informer.
import lxml.etree as et
tree=et.fromstring(xml)
Les différentes choses que j'ai essayé sont:
for node in tree.xpath('//entry'):
ou
namespaces = {None:"http://www.w3.org/2005/Atom" ,"openSearch":"http://a9.com/-/spec/opensearchrss/1.0/" ,"gsa":"http://schemas.google.com/gsa/2007"}
for node in tree.xpath('//entry', namespaces=ns):
ou
for node in tree.xpath('//\"{http://www.w3.org/2005/Atom}entry\"'):
À ce point, je ne sais plus quoi essayer. Toute aide est grandement appréciée.
- Il se sent vraiment bizarre qu'il ne sera pas vous permettre de trouver des balises dans l'espace de noms par défaut qui n'était pas assigné à un nom. Je ne pouvais pas en croire mes yeux quand j'ai rencontré cette.
Vous devez vous connecter pour publier un commentaire.
Quelque chose comme cela devrait fonctionner:
Voir aussi http://lxml.de/xpathxslt.html#namespaces-and-prefixes.
Alternative:
<entry>
, plutôt que de<atom:entry>
tree.xpath("atom:entry")
ne fonctionne pas alors que dans le non-préfixée documenttree.xpath("atom:entry")
fonctionne. Vous avez besoin de la//
comme danstree.xpath("//atom:entry")
.local-name
astuce est bonne, pour trouver des non-préfixée éléments parmi des espaces de ceux.Utilisation findall méthode.
tree.xpath()