Python ElementTree中XPath含text()谓词报SyntaxError: invalid predicate
问题原因及解决方法
为什么会报错?
Python标准库的xml.etree.ElementTree只支持有限的XPath子集,你用的text()在谓词中直接调用的写法,不在它支持的范围内,所以会抛出「SyntaxError: invalid predicate」错误。
两种解决办法
方法一:用Python代码筛选(不换库)
不用XPath的谓词逻辑,先查出所有<p>元素,再用列表推导式筛选文本匹配的:
import xml.etree.ElementTree as ET data = '''<root> <child> <p>aaa</p> <p>bbb</p> </child> </root>''' root = ET.fromstring(data) # 先获取所有p元素,再筛选文本为aaa的(strip()处理可能的空白缩进) p_elements = [p for p in root.findall(".//p") if p.text and p.text.strip() == 'aaa'] if p_elements: print(p_elements[0].text)
方法二:改用lxml库(支持完整XPath)
如果习惯用标准XPath语法,可以安装lxml库,它支持完整的XPath 1.0特性:
- 先安装库:
pip install lxml - 修改代码替换导入部分,其余逻辑不变:
from lxml import etree as ET # 替换原来的导入语句 data = '''<root> <child> <p>aaa</p> <p>bbb</p> </child> </root>''' root = ET.fromstring(data) p_element = root.findall(".//p[text()='aaa']") print(p_element[0].text)
这段代码就能正常运行,不会报错。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

