python 为什么Xpath //el[not(@attrib=“A”)]或//el[@attrib!=“A”]查找属性为“A”的元素

rbpvctlc  于 2022-12-25  发布在  Python
关注(0)|答案(1)|浏览(126)

在使用lxml的Python脚本中,我使用下面的Xpath来查找具有特定文本内容但特定属性没有特定值的元素,如下所示:

xpath('//el[text()="something" or text()="something else" or text()="this other thing" and @attrib!="A"]')

我也试过:

xpath('//el[text()="something" or text()="something else" or text()="this other thing" and not(@attrib="A")]')

这是循环的一部分,如下所示:

for element in root.xpath('//el[text()="something" or text()="something else" or text()="this other thing" and not(@attrib="A")]'):

    element.get('attrib')

在结果中我得到了很多"A"值。我不知道我做错了什么。这是不应该发生的。
=========加法=========

for el in root_element.xpath('//tok[text()="altra" or text()="altres" or text()="altr" and not(@lemma="altre")]'): 
        wrong_lemma = el.get('lemma')

这是一个文档的一部分的例子,它包含了不应该匹配的元素,但是它是匹配的。我得到了'altre'作为输出中变量'wrong_lemma'的值。

<tok id="w-1264" ord="5" lemma="altre" xpos="DI0CP0">altres</tok> <tok id="w-1265" ord="6" lemma="insigne" xpos="AQ0CP00">insignes</tok> <tok id="w-1266" ord="7" lemma="cavaller" xpos="NCMP000">cavallers</tok>

以下选项也不起作用:

for el in root_element.xpath('//tok[text()="altra" or text()="altres" or text()="altr" and @lemma!="altre"]'): 
        wrong_lemma = el.get('lemma')
for el in root_element.xpath('//tok[text()="altra" or text()="altres" or text()="altr" and not(contains(@lemma!="altre"))]'): 
        wrong_lemma = el.get('lemma')
pod7payv

pod7payv1#

建议大家不要在一天累的时候工作到很晚。今天早上在再次阅读答案后,我发现问题出在XPath的语法上。
我需要做的是在布尔OR选项周围添加一个括号,缺少括号会把整个事情搞砸,下面是有效的方法:

xpath('//el[(text()="something" or text()="something else" or text()="this other thing") and @attrib!="A"]')

这将不匹配以前匹配的XML片段,即使必须排除它们。

相关问题