gpt4 book ai didi

ruby - XPath中的 `@attr!="值"` and ` not(@attr ="value")`有什么区别

转载 作者:数据小太阳 更新时间:2023-10-29 08:02:23 25 4
gpt4 key购买 nike

有一个这样的 HTML。

<div class="paginate_box">
<span class="disabled prev_page">Back</span>
<span class="current">1</span>
<a rel="next" href="page2">2</a>
<a rel="next" href="page3">3</a>
<a class="next_page" rel="next" href="page2">Next</a>
</div>

为了获得最大的页数,我写了这篇文章。

doc = Nokogiri::HTML(html)
doc.xpath('//div[@class="paginate_box"]/a[not(@class="next_page")]').last.text
#=> "3"

一开始我写的是 a[@class!="next_page"] 而不是 a[not(@class="next_page")],但它没有不匹配标签。为什么不匹配?我做错了什么?

最佳答案

所以这里的问题是您正试图在仅出现在最后一个节点上的属性 (@class) 上使用 !=。这意味着 @class 无法在其他节点上进行比较,因为它实际上什么也没说 != 'next_page'。

因为没有什么是不可比的,运算符(包括 !==)将始终返回 false。

在您的 not 函数中,您询问是否 nothing = 'next_page' 始终为 false(如上所述),因此 not 使得它 true 并且元素被选中。

您可以通过向其他 anchor 标记之一添加一个类然后使用 != 版本来证明这一点。

旁注,您可以简化代码以仅使用 xpath

doc.xpath('//div[@class="paginate_box"]/a[not(@class="next_page")][last()]').text 
#=> "3"
# Or
doc.xpath('//div[@class="paginate_box"]/a[not(@class="next_page")][last()]/text()').to_s
#=> "3"

此外,如果 next_page anchor 始终存在且始终位于最后,并且最高页码始终位于它之前,那么您可以完全避免这种情况:

doc.xpath('//div[@class="paginate_box"]/a[position()=last()-1]').text
#=> "3"

这里我们说的是在该 div 中最后一个 anchor 之前的位置找到 anchor 。

备选方案:

doc.xpath('//div[@class="paginate_box"]/a[last()]/preceding-sibling::a[1]').text
#=> "3"

这将找到最后一个 anchor ,然后按自下而上的顺序找到它前面的所有 anchor sibling ,我们将选择该列表中的第一个。

关于ruby - XPath中的 `@attr!="值"` and ` not(@attr ="value")`有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56154300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com