html - 如何在 xpath 中同时使用 (and) 和 (or)
问题描述
我正在尝试使用(和)和(或)这两个表达式一起创建一个 xpath,但没有成功。
- 我想获取产品的价格,但有些价格来了,
.//p/span[@class='currency-value']
而另一些价格来了,.//p/span/span[@class='currency-value']
所以我想为此使用 OR 表达式 - 而且我不希望产品用于广告的价格,所以我正在使用
.//span[not(contains(text(),'Ad'))]
我在 xpath 下尝试过,但它不起作用。
.//p/span[@class='currency-value'] | .//p/span/span[@class='currency-value'] and .//span[not(.='Ad')]
解决方案
与其说“尝试 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')]
无论哪种方式,如果我是正确的,您的意图是排除一些否则会被选中的节点,那么一个额外的谓词就是这样做的方法。
推荐阅读
- notifications - 我如何从 Stackoverflow 接收来自我活跃的问题更改的浏览器通知?
- javascript - 在 LAN 上共享的 Electron js 应用程序
- reactjs - 如何使图标按钮粘在导航栏的左侧
- cypress - 从 cypress 自定义命令返回一个数组值并从测试中访问它
- mysql - 内查询无结果时外查询很慢
- css - 如何在 CSS 中选择孩子
- google-chrome - 为什么 Google Chrome 和其他浏览器在 Accept-Language 标头中发送首选语言代码时不遵循 RFC 5646?
- python - 我使用 selenium 进行抓取,但在 56 个列表中我只能获得 40 个列表。但是所有 56 个列表的类名都相同
- python - Pandas 生成带有标题和特定结构的报告
- google-bigquery - BigQuery 性能对列数据长度的影响