XPath中not()函数条件分组问题排查(Python lxml场景)
解决XPath筛选元素的逻辑错误问题
你的问题出在XPath的运算符优先级上——and的优先级比or高,所以你写的表达式实际逻辑是:
匹配文本为"something"的元素,或者文本为"something else"的元素,或者文本为"this other thing"且attrib属性不等于"A"的元素
这就导致前两类文本的元素,不管attrib是不是"A"都会被匹配到,这就是你看到不符合预期元素的原因。
正确的表达式写法
把所有文本匹配条件用括号包裹,确保它们整体和属性过滤条件用and关联:
xpath('//el[(text()="something" or text()="something else" or text()="this other thing") and not(@attrib="A")]')
更简洁的写法可以用XPath的多值匹配:
xpath('//el[text()=("something", "something else", "this other thing") and not(@attrib="A")]')
针对tok元素的示例
如果要筛选文本为"altres"且xpos属性不等于"DI0CP0"的tok元素,表达式可以写:
xpath('//tok[text()="altres" and not(@xpos="DI0CP0")]')
或者用!=:
xpath('//tok[text()="altres" and @xpos!="DI0CP0"]')
内容的提问来源于stack exchange,提问作者jfontana
相关产品推荐
相关产品推荐

