Python lxml iterfind с пространством имен, но префикс = нет - PullRequest
6 голосов
/ 24 июня 2011

Я хочу выполнить iterfind() для элементов, которые имеют пространство имен, но не имеют префикса.Я хотел бы позвонить

iterfind([tagname]) или iterfind([tagname], [namespace dict])

. Я не хочу каждый раз вводить тег следующим образом:

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

Подробности

Я работаю с xml-ответом от Google API.Корневой узел определяет несколько пространств имен, в том числе одно, для которого нет префикса: xmlns="http://www.w3.org/2005/Atom"

Похоже, что когда я пытаюсь выполнить поиск по моему этри, все ведет себя так, как я ожидаю для элементов с префиксом.Например:

>>> 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>
>>>

Но когда я пытаюсь найти что-то без префикса, поиск не добавляет автоматически пространство имен для root.nsmap[None].Например:

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

Даже если я попытаюсь добавить карту пространства имен в качестве необязательного аргумента для iterfind, он не присоединит пространство имен.

1 Ответ

3 голосов
/ 26 июня 2011

Попробуйте это:

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

Для получения дополнительной информации: прочитайте документы: http://lxml.de/tutorial.html#namespaces

Если вы не хотите вводить это, и вы хотите предоставить карту пространства имен,вы всегда должны использовать префикс, например, такой:

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

(то же самое происходит, если вы хотите использовать xpath)

Какой префикс используется в документе, если есть,это не важно, речь идет о том, чтобы вы указали полное имя элемента, либо записали его вместе с URI с использованием записи в фигурных скобках, либо с помощью префикса, сопоставленного с URI.

...