#python #xml
Вопрос:
есть ли способ использовать логические операторы в xpath команды findall. Например: root.findall("./example/[value='a' or 'b']/example2"
Комментарии:
1. Что такое
root
? Вам нужно, по крайней мере, указать, используете ли вы ElementTree, BeautifulSoup, lxml или что-то еще.2. корень есть
root = tree.getroot()
3. Элементтри? Вы не можете заставить нас гадать!
4. Да, есть в названии
5. ElementTree имеет только базовую поддержку xpath afaik. Возможно, вам больше повезет с использованием lxml.
Ответ №1:
Не удалось заставить XPATH работать, ElementTree
но он смог заставить его работать lxml
.
Было неясно, является ли value
это атрибутом или дочерним example
элементом, поэтому я показываю и то, и другое.
import lxml.etree as ET
data = '''
<abc>
<example value="a">
<example2>foo</example2>
</example>
<example value="b">
<example2>bar</example2>
</example>
<example value="x">
<example2>not this</example2>
</example>
</abc>
'''
root = ET.fromstring(data)
for e in root.xpath('./example[@value="a" or @value="b"]/example2'):
print(e.text)
data2 = '''
<abc>
<example>
<value>a</value>
<example2>abc</example2>
</example>
<example>
<value>b</value>
<example2>def</example2>
</example>
<example>
<value>not this</value>
<example2>xyz</example2>
</example>
</abc>
'''
root = ET.fromstring(data2)
for e in root.xpath('./example[value="a" or value="b"]/example2'):
print(e.text)