Я не могу разрешить ‘lxml.etree.Ошибка XPathEvalError: недопустимое выражение’ для юридического выражения XPATH

#python #python-3.x #xpath #lxml

#python #python-3.x #xpath #lxml

Вопрос:

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

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

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

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

 Traceback (most recent call last):
  File "poc_xpath2.0_v1.py", line 9, in <module>
    x = tree.xpath("//description/caution[1]/preceding-sibling::*/name()!='warning'")
  File "srclxmletree.pyx", line 2276, in lxml.etree._ElementTree.xpath
  File "srclxmlxpath.pxi", line 359, in lxml.etree.XPathDocumentEvaluator.__call__
  File "srclxmlxpath.pxi", line 227, in lxml.etree._XPathEvaluatorBase._handle_result
lxml.etree.XPathEvalError: Invalid expression
  

Комментарии:

1. Во-первых, какую версию xpath вы используете? Во-вторых, было бы полезно иметь XML-код, с которым вы работаете.

2. Помог ли мой ответ или у вас все еще возникают проблемы?

Ответ №1:

Исключение связано с тем, что 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 .

Комментарии:

1. Спасибо, Дэниел. Он работает просто отлично. Еще раз спасибо