У меня возникли проблемы с использованием атрибута XPath Selector в ElementTree, что я должен был сделать в соответствии с Документация
Вот пример кода
XML
<root>
<target name = "1">
<a></a>
<b></b>
</target>
<target name = "2">
<a></a>
<b></b>
</target>
</root>
Python
def parse(document):
root = et.parse(document)
for target in root.findall("//target[@name='a']"):
print target._children
Я получаю следующее исключение:
expected path separator ([)
Зачем закрывать это? Мне это пригодилось ... Вряд ли не по теме.
Похоже, findall only поддерживает подмножество XPath. См. Обсуждение в списке рассылки здесь.






Синтаксис, который вы пытаетесь использовать, является новым в ElementTree 1.3.
Такая версия поставляется с Python 2.7 или выше. Если у вас Python 2.6 или меньше, у вас все еще есть ElementTree 1.2.6 или меньше.
В этом коде есть несколько проблем.
Встроенный Python ElementTree (сокращенно ET) не имеет реальной поддержки XPATH; только ограниченное подмножество. Например, он не поддерживает выражения найти из корня, такие как //target.
Примечание: документация
упоминает "//", но только для детей: Итак, выражение как
.//target действителен; //... нет!
Есть альтернативная реализация: lxml, более богатая. По швам используется документация для встроенного кода. Это не совпадает / не работает.
Обозначение @name выбирает xml-атрибуты; выражение key=value в xml-теге.
Таким образом, это имя-значение должно быть 1 или 2, чтобы выбрать что-то в данном документе. Или можно искать цели с дочерним элемент'а': target[a] (no @).
Для данного документа, проанализированного с помощью встроенного ElementTree (v1.3) для получения root-прав, следующий код верен и работает:
root.findall(".//target") Найдите обе целиroot.findall(".//target/a") Найдите два а-элементаroot.findall(".//target[a]") Это снова находит оба целевых элемента, так как оба имеют a-элементroot.findall(".//target[@name='1']") Найдите только цель первый. Обратите внимание, что необходимы кавычки около 1; иначе возникает SyntaxErrorroot.findall(".//target[a][@name='1']") Также действительно; найти эту цельroot.findall(".//target[@name='1']/a") Находит только один a-элемент; ...
При использовании ElementTree 1.2.6 функции атрибута xpath доступны только в 1.3 и более поздних версиях.