ElementTree XPath - выбор элемента на основе атрибута

У меня возникли проблемы с использованием атрибута 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 ([)

При использовании ElementTree 1.2.6 функции атрибута xpath доступны только в 1.3 и более поздних версиях.

Nick Stinemates 21.10.2008 20:14

Зачем закрывать это? Мне это пригодилось ... Вряд ли не по теме.

daramarak 11.04.2011 13:39

Похоже, findall only поддерживает подмножество XPath. См. Обсуждение в списке рассылки здесь.

Mike Marshall 21.10.2008 20:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
44
3
43 165
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Синтаксис, который вы пытаетесь использовать, является новым в ElementTree 1.3.

Такая версия поставляется с Python 2.7 или выше. Если у вас Python 2.6 или меньше, у вас все еще есть ElementTree 1.2.6 или меньше.

В этом коде есть несколько проблем.

  1. Встроенный Python ElementTree (сокращенно ET) не имеет реальной поддержки XPATH; только ограниченное подмножество. Например, он не поддерживает выражения найти из корня, такие как //target.

    Примечание: документация упоминает "//", но только для детей: Итак, выражение как .//target действителен; //... нет!

    Есть альтернативная реализация: lxml, более богатая. По швам используется документация для встроенного кода. Это не совпадает / не работает.

  2. Обозначение @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; иначе возникает SyntaxError
  • root.findall(".//target[a][@name='1']") Также действительно; найти эту цель
  • root.findall(".//target[@name='1']/a") Находит только один a-элемент; ...

Другие вопросы по теме