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