2011-06-24 12 views
6

Chcę wykonać iterfind() dla elementów, które mają przestrzeń nazw, ale bez prefiksu. Chciałbym zadzwonićPython lxml iterfind w/namespace, ale prefiks = brak

iterfind([tagname]) lub iterfind([tagname], [namespace dict])

Nie dbam, aby wprowadzić znacznik w następujący sposób za każdym razem:

"{%s}tagname" % tree.nsmap[None]

Szczegóły

jestem uruchomienie odpowiedzi XML z interfejsu API Google. Węzeł główny definiuje kilka przestrzeni nazw, w tym jeden, dla którego nie ma prefiksu: xmlns="http://www.w3.org/2005/Atom"

Wygląda na to, że gdy próbuję przeszukać moją regułę, wszystko zachowuje się tak, jak oczekiwałbym w przypadku elementów z prefiksem. np .:

>>> for x in root.iterfind('dxp:segment'): print x 
... 
<Element {http://schemas.google.com/analytics/2009}segment at 0x1211b98> 
<Element {http://schemas.google.com/analytics/2009}segment at 0x1211d78> 
<Element {http://schemas.google.com/analytics/2009}segment at 0x1211a08> 
>>> 

Ale gdy próbuję szukać czegoś bez przedrostka, wyszukiwanie nie automatycznie dodać nazw dla root.nsmap[None]. np .:

>>> for x in root.iterfind('entry'): print x 
... 
>>> 

Nawet jeśli próbuję rzucić mapę namespace się jako opcjonalny argument dla iterfind, nie będzie dołączyć nazw.

Odpowiedz

3

Spróbuj tego:

for x in root.iterfind('{http://www.w3.org/2005/Atom}entry'): 
    print x 

Aby uzyskać więcej informacji: przeczytaj dokumenty: http://lxml.de/tutorial.html#namespaces

Jeśli nie chcesz wpisywać, że i chcesz przedstawiają mapę przestrzeni nazw, zawsze trzeba używać prefiks, jak to na przykład:

nsmap = {'atom': 'http://www.w3.org/2005/Atom'} 
for x in root.iterfind('atom:entry', namespaces=nsmap): 
    print x 

(samo wychodzi, jeśli chcesz używać XPath)

Jaki prefiks jest używany w dokumencie, jeśli jest, nie jest ważny, chodzi o to, że określasz w pełni kwalifikowaną nazwę elementu, wpisując go w komplecie z identyfikatorem URI za pomocą notacji nawiasów klamrowych lub używając prefiksu odwzorowanego na URI.

+0

Dzięki, ale problemem nie jest to, że nie wiem, jak zdobyć elementy pasujące do tagu. Problem polega na tym, że chciałbym po prostu wpisać znacznik bez przestrzeni nazw i po prostu dostarczyć tabelę przestrzeni nazw, tak aby magia wydarzyła się w tle (tak jak by to było, gdyby był zaangażowany prefiks). – JellicleCat

+0

@JellicleCat: zaktualizowałem moją odpowiedź, mam nadzieję, że to pomaga. – Steven

Powiązane problemy