ElementTree XPath - выбор элемента на основе атрибута
У меня возникли проблемы с использованием 9X_xml.etree атрибута XPath Selector в ElementTree, что 9X_pythonic я могу сделать в соответствии с Documentation
Вот пример 9X_elementtree кода
XML
Python
def parse(document): root = et.parse(document) for target in root.findall("//target[@name='a']"): print target._children
Я получаю следующее исключение:
expected path separator ([)
- При использовании ElementTree 1.2.6 ...
Ответ #1
Ответ на вопрос: ElementTree XPath - выбор элемента на основе атрибута
Синтаксис, который вы пытаетесь использовать, является 9X_python-shell новым в ElementTree 1.3.
Такая версия поставляется с Python 2.7 или 9X_celementtree выше. Если у вас Python 2.6 или меньше, у 9X_python-shell вас все еще есть ElementTree 1.2.6 или меньше.
Ответ #2
Ответ на вопрос: ElementTree XPath - выбор элемента на основе атрибута
В этом коде есть несколько проблем.
-
Встроенный 9X_python-shell Python ElementTree (сокращенно ET) не имеет 9X_python реальной поддержки XPATH; только ограниченное 9X_xml.etree подмножество. Например, он не поддерживает 9X_python-shell выражения поиск из корня, такие как
//target
.Примечание: documentation упоминает 9X_elementtree "//", но только для детей: поэтому 9X_etree выражение как
.//target
действителен;//...
нет!Существует 9X_pythonista альтернативная реализация: lxml, более богатая. По 9X_pythonic швам используется документация для встроенного 9X_python-interpreter кода. Это не соответствует / не работает.
-
Обозначение 9X_etree
@name
выбирает xml- атрибуты; выражениеkey=value
в теге xml.Таким 9X_pythonista образом, это имя-значение должно быть 1 9X_celementtree или 2, чтобы выбрать что-то в данном документе. Или 9X_xml.etree можно искать цели с помощью дочернего элемента 'a':
target[a]
(no 9X_pythonista @).
Для данного документа, проанализированного 9X_python с помощью встроенного ElementTree (v1.3) для 9X_etree получения root-прав, следующий код верен 9X_py и работает:
root.findall(".//target")
Найдите обе целиroot.findall(".//target/a")
Найдите два 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-элемент; ...
-
4
-
6
-
5
-
3
-
9
-
3
-
9
-
5
-
1
-
4
-
4
-
4
-
2
-
1
-
7
-
5
-
1
-
9
-
5
-
2
-
3
-
4
-
1
-
1
-
7
-
2
-
1
-
5
-
4
-
3
-
1
-
6
-
2
-
11
-
2
-
10
-
1
-
3
-
1
-
7
-
3
-
4
-
8
-
1
-
2
-
1
-
2
-
2
-
1
-
3