首页 > 解决方案 > 如何在 xpath 中同时使用 (and) 和 (or)

问题描述

我正在尝试使用(和)和(或)这两个表达式一起创建一个 xpath,但没有成功。

  1. 我想获取产品的价格,但有些价格来了,.//p/span[@class='currency-value']而另一些价格来了,.//p/span/span[@class='currency-value']所以我想为此使用 OR 表达式
  2. 而且我不希望产品用于广告的价格,所以我正在使用.//span[not(contains(text(),'Ad'))]

我在 xpath 下尝试过,但它不起作用。

.//p/span[@class='currency-value'] | .//p/span/span[@class='currency-value'] and .//span[not(.='Ad')]

标签: htmlseleniumxpath

解决方案


与其说“尝试 XXX”,我认为如果您了解当前尝试的问题所在,这将很有用。

.//p/span[@class='currency-value'] | .//p/span/span[@class='currency-value'] and .//span[not(.='Ad')]

“|” XPath 中的运算符表示“联合”——它形成两个节点集的联合。因此//x | //y选择由 选择的节点//x和由选择的节点的并集//y。到目前为止,一切都很好。您可以将表达式的“联合”部分简化为

(.//p/span | .//p/span/span)[@class='currency-value']

如果你想。

“和”更成问题。“and”的操作数必须是布尔值,而在您的表达式中,两个操作数都是节点集。我怀疑(虽然我不能确定)你的意图是从联合节点集中排除那些满足谓词.='Ad'但没有看到你的源数据的节点,不清楚产品和价格如何相互关联。也许您打算这样做:

(.//p/span | .//p/span/span)[@class='currency-value'][not(.='Ad')]

或者这个:

(.//p/span | .//p/span/span)[@class='currency-value'][not(..='Ad')]

无论哪种方式,如果我是正确的,您的意图是排除一些否则会被选中的节点,那么一个额外的谓词就是这样做的方法。


推荐阅读