2017-03-17 61 views
-1

我正在使用Rails 5與Nokogiri。如何選擇包含文本的最小元素?如何選擇包含文本的最小元素

我有我的網頁上這個元素:

<td class="style35" style="font-size: medium; border: thin solid #000000"> 
         Location</td> 

,我想我可以用選擇它:

doc.at('td:contains("Location")') 

相反,選擇了包含包含此元素表的包裝TD :

<td><span class="myClass"><table> .... 

什麼是寫一個表達式的正確方法來選擇更小包含我想要的文本的st(最簡單?)元素?

+2

這不是「引入nokogiri」,這是「引入nokogiri」,「入圍」的「選擇」,「德」是「的」,「ocntains」是「包含」。語法和拼寫對於SO非常重要。你的問題是參考頁面的開始,答案就是問題的解決方案,就像是百科全書或食譜中的一個頁面。 –

+1

請閱讀「[mcve]」。您需要爲我們提供一個HTML代碼的最小示例,它將以單件形式展示問題,而不是以單獨的塊形式顯示。不要讓我們重建它。 –

回答

-1

選取所有td元素,按內容長度排序並選取第一個元素。根據您的需要更改選擇器。排序默認爲升序。所以你首先得到最小的元素。

doc.css('td').sort_by do |td_element| 
    l.text.length 
end.first 
+0

你的邏輯不適用於我的情況,tho。表達式「doc.at('td:contains(」Location「)'」只返回一個元素,運行「doc.at('td:contains(」Location「)')。在''td:contains(「Location」)')「爲我提供了我想要的這個特定案例的元素,但是總的來說,我不知道有多少級別可以深入查找我要找的內容 – Dave

+0

This不是很好的邏輯,後續的單元格可能包含比期望的更短的字符串,而且你的示例代碼是無效的,我建議你測試你的代碼,對照示例HTML並顯示你的結果。 –

0

如果使用at方法,它將只返回第一個結果。

css方法將返回所有匹配CSS選擇器的元素,正確的td元素和td元素包裝在整個表中。

如果使用這樣的事情,它會發現所有的td標籤,包含單詞Location,那麼它將存儲未在陣列周圍另一個td標籤包裝的元素:

td_with_no_child_and_have_location = [] 

doc.css("td:contains('Location')").each do |td_element| 
    if td_element.css("td").empty? 
     td_with_no_child_and_have_location << td_element 
    end 
end 

first_td = td_with_no_child_and_have_location.first 
+0

我沒有很好地解釋自己。我不希望TD擁有最少的HTML,我希望TD沒有其他的孩子TD,其文本中包含單詞「Location」。 – Dave

+0

我更新了答案,以便存儲適合元素的數組如果你知道你的元素總是第一個元素,那麼你可以使用該數組的第一個元素。 –

+0

感謝你的更新。有沒有什麼辦法可以編寫一個CSS選擇器循環? – Dave

0

這是如果您不向我們提供最低的HTML,很難幫助您。我試圖重建它,但情況因人而異:

require 'nokogiri' 

doc = Nokogiri::HTML(<<EOT) 
<html><body><table><tr> 
<td><span class="myClass"><table><tr> 
     <td class="style35" style="font-size: medium; border: thin solid #000000"> 
     Location</td> 
</tr></table></td></tr></table></html> 
EOT 
doc.at('.myClass td.style35').text # => "\n  Location" 

如果你想在標籤嵌入到另一個表,然後採取的一些其他特性來幫助您導航,如類信息。

在這種情況下使用at應該有所幫助,因爲通常情況下,表的標題將位於包含第一個單元格的第一行。 at相當於search('some selector').first

上面的選擇器甚至可以寫成.myCLass .style35td td,它會在另一個td內找到td。再加上at,你會得到第一個事故發生:

doc.at('.myClass td.style35').text # => "\n  Location" 
doc.at('.myClass .style35').text # => "\n  Location" 
doc.at('td td').text # => "\n  Location" 
+0

我在尋找somethign更一般。運輸署並不總是將「myClass」作爲一個班級。我正在尋找包含給定文本的TD,其中沒有其他TD。 – Dave

+0

您需要在您的問題中提供更多信息。它非常寬泛,不符合「[mcve]」中的指導原則。我們不能投票,因爲你有獎金。如果你想寫一個通用的「總是找到一個標題」的單元格,而事先不知道該標題或文檔的結構是什麼,那麼你將會很難。 –

相關問題