Как выбрать данные для элемента XML с определенным значением атрибута? - PullRequest
4 голосов
/ 01 января 2011

Дано:

<foo>
 <bar key="true">text1</bar>
 <bar key="false">text2</bar>
 <bar key="true">text3</bar>
 <bar key="true">text4</bar>
</foo>

Я хочу получить текст для элемента bar, где атрибут ключа = "false".

Мое приложение Python 2.5.5 для GAE. XML не является истинным xml, но я могу загрузить его как ElementTree и получать данные в обычном режиме.

Пример кода:

result = urllib2.urlopen(url).read()
xml = ElementTree.fromstring(result)
str = xml.find("./bar").attrib['key']

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

UPDATE:

str = xml.findtext("./bar[@key='false']")

Выдает ошибку:

  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/xml/etree/ElementPath.py", line 93, in __init__
    "expected path separator (%s)" % (op or tag)
SyntaxError: expected path separator ([)

Ответы [ 4 ]

3 голосов
/ 07 декабря 2011

Я могу ошибаться, но я не думаю, что нотация "./bar[@key='false']" работает в Python 2.5.5 (или, по крайней мере, не с ElementTree, который идет с ним). Я наблюдал ту же проблему в Python 2.6.5, но она работает в Python 2.7.1. Я думаю, вам придется использовать другую библиотеку или попробовать "экспериментальный" GAE с Python 2.7.

2 голосов
/ 01 января 2011

Этот XPath выберет узлы bar, чей атрибут key равен false:

/foo/bar[@key='false']

Если текущий узел контекста является узлом foo, это также будет работать:

./bar[@key='false']
1 голос
/ 28 ноября 2012

Исходя из ответа здесь , функциональность селектора XPath не была реализована в ElementTree до версии 1.3, которая поставляется с Python 2.7, как сказал @ cdemers .

0 голосов
/ 19 ноября 2015

«[@ attrib]», который вы используете, представлен только в ElementTree 1.3: http://effbot.org/zone/element-xpath.htm

, который был представлен только в Python 2.7:

https://docs.python.org/2/library/xml.etree.elementtree.html

Как уже упоминали другие люди, вам нужно получить этот атрибут по-другому или обновить Python, чтобы этот код работал.

...