Я не могу решить ошибку 'lxml.etree.XPathEvalError: Invalid expression' - PullRequest
1 голос
/ 26 марта 2019

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

Код, который должен это сделать:

x = tree.xpath("//description/caution[1]/preceding-sibling::*/name()!='warning'")
print(x)

Ожидаемый результат будет логическим значением, но он показывает ошибку.

Traceback (последний вызов был последним): Файл "poc_xpath2.0_v1.py", строка 9, в x = tree.xpath ("// description / caution [1] / previous-sibling :: * / name ()! = 'warning'") Файл "src \ lxml \ etree.pyx", строка 2276, в lxml.etree._ElementTree.xpath Файл "src \ lxml \ xpath.pxi", строка 359, в lxml.etree.XPathDocumentEvaluator. call Файл "src \ lxml \ xpath.pxi", строка 227, в lxml.etree._XPathEvaluatorBase._handle_result lxml.etree.XPathEvalError: Неверное выражение

1 Ответ

1 голос
/ 26 марта 2019

Исключением является то, что name() не является допустимым типом узла. Ваш XPath будет действительным только как XPath 2.0 или выше. lxml поддерживает только XPath 1.0 .

Вам необходимо переместить name() != 'warning' в предикат .

Кроме того, если вы хотите получить результаты True / False, включите xpath в boolean() ...

tree.xpath("boolean(//description/caution[1]/preceding-sibling::*[name()!='warning'])")

Полный пример ...

from lxml import etree

xml = """
<doc>
    <description>
        <warning></warning>
        <caution></caution>
    </description>
</doc>"""

tree = etree.fromstring(xml)

x = tree.xpath("boolean(//description/caution[1]/preceding-sibling::*[name()!='warning'])")
print(x)

Это напечатало бы False.

...