如果我的理解正确,您的 HTML 看起来像这样:
<div>
This is the div we want.
<span class="test1">Span contents</span> Other contents
</div>
<div>
We don't want this div.
<span class="something else">Not this</span> one
</div>
你想选择第一个div,而不是第二个。
这在 CSS 中是不可能的(据我所知,Nokogiri 实现的任何 CSS 扩展都不可能),但可以使用 XPath 来完成。
选择我们想要的div 的简单 XPath 查询可能如下所示:
//div[span[@class = 'test1']]
这可以理解为“所有具有span 元素的div 元素都是具有class 属性和值为test1 的直接子元素”。
此查询仅测试class 属性是否与test1 直接匹配,因此如果类类似于“test1 otherclass”,则不会匹配。要让它像 CSS 一样工作,您需要将测试更改为:
[contains(concat(' ', normalize-space(@class), ' '), ' test1 ')]
此外,原始查询仅选择spans,它们是div 的直接子代。如果您在要匹配的其他元素中有span,则需要在查询中使用descendant 轴。
把它们放在一起:
//div[descendant::span[contains(concat(' ', normalize-space(@class), ' '), ' test1 ')]]
可以理解为“所有div 元素在test1 类中的span 后代(在CSS 意义上)”。
显然要使用它,您需要使用 xpath method 而不是 css 方法:
divs = @page.xpath("//div[descendant::span[contains(concat(' ', normalize-space(@class), ' '), ' test1 ')]]")