如果我理解正確的話,你有一些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(並且據我所知不可能與任何CSS擴展Nokogiri實現),但可以使用XPath完成。
一個簡單的XPath查詢會選擇我們想要看起來是這樣的div
:
//div[span[@class = 'test1']]
這可以被解讀爲「有span
元素有class
屬性與價值直接孩子們都div
元素test1
「。
此查詢只測試class
屬性與test1
直接匹配,所以如果類是「test1 otherclass」
之類的話,它將不匹配。爲了得到它像CSS工作,你需要測試更改爲類似:
[contains(concat(' ', normalize-space(@class), ' '), ' test1 ')]
另外原來的查詢只選擇span
s表示是div
的直接孩子。如果您想要匹配其他元素中的span
,則需要在查詢中使用descendant
軸。
全部放在一起:
//div[descendant::span[contains(concat(' ', normalize-space(@class), ' '), ' test1 ')]]
這可以讀作「有一個span
後裔是在test1
類(在CSS意義上的)所有div
元素」。
顯然用這個你需要使用xpath
method不是css
方法:
divs = @page.xpath("//div[descendant::span[contains(concat(' ', normalize-space(@class), ' '), ' test1 ')]]")