使用带not逻辑条件的XPath调用findall报invalid predicate错误如何解决
报错原因
该invalid predicate错误由Python标准库xml.etree.ElementTree的XPath支持能力限制导致:标准库ElementTree仅实现了XPath 1.0的功能子集,不支持在谓词中使用not()这类布尔函数,因此语法合法的XPath语句调用findall时会被判定为无效。
适配方案
方案1:继续使用标准库ElementTree,手动过滤属性
先全量查询descriptors节点,再通过代码逻辑筛选符合属性要求的节点,最终提取对应mainterm值,示例代码如下:
terms = [] # 先查询所有descriptors节点 all_descriptors = item.findall(".//ns0:descriptors", prefix_map) for desc_node in all_descriptors: current_type = desc_node.get("type") # 过滤掉type为MEA或MEB的节点 if current_type not in ("MEA", "MEB"): # 提取当前节点下的所有mainterm文本 mainterm_nodes = desc_node.findall(".//ns0:mainterm", prefix_map) for mt_node in mainterm_nodes: terms.append(mt_node.text.strip())
方案2:切换到lxml库,使用完整XPath支持
lxml库实现了完整的XPath 1.0标准,无需调整XPath写法即可直接生效,示例代码如下:
from lxml import etree # XML解析、命名空间绑定逻辑保持不变 # 直接使用带not()的XPath查询,同时排除MEA、MEB两种type terms = item.xpath( ".//ns0:descriptors[not(@type=('MEA', 'MEB'))]//ns0:mainterm/text()", namespaces=prefix_map )
如果需要获取mainterm节点对象而非直接提取文本,去掉XPath路径末尾的/text()即可。
内容的提问来源于stack exchange,提问作者Magdalena
相关产品推荐
相关产品推荐

