2014-03-03 85 views
0

我是Ruby on Rails的新手。我想在Nokogiri中使用CSS解析來選擇HTML頁面上的整個div,而不是隻選擇嵌套元素。例如,如果我選擇:如何根據嵌套跨度類使用Nokogiri gem選擇div?

@sel = @page.css("div").select{|li| li['class']== "test" } 
@sel_net = @sel.css("span").select{|li| li['class']== "test1" } 

這將選擇從所有的div跨度與class等於test1。但是,如果我想要選擇整個外部div,其範圍是class,名稱爲test1?那可能嗎?

回答

1

如果我理解正確的話,你有一些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 ')]]")