Элемент элемента вопроса Python о булевых операторах

#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)