2017-07-12 63 views
1

如何,我可以得到以下,一旦所有元素,如:通過機械化獲得所有標籤追蹤信息? (紅寶石)

<div id="exemple"> 
    <h2 class="target">foo</h2> 
    <p>bla bla</p> 
    <ul> 
    <li>bar1</li> 
    <li>bar2</li> 
    <li>bar3</li> 
    </ul> 
    <h4>baz</h4> 
    <ul> 
    <li>lot</li> 
    </ul> 
    <div>of</div> 
    <p>possible</p> 
    <p>tags</p> 
    <a href="#">after</a> 
</div> 

我需要檢測<h2 class="target">,並得到所有標籤到下一個<h4>而忽略<h4>所有如下標籤(如果<h4>不存在,我必須讓所有標籤的父結束[此處的<div>結束])

的內容是動態的和不可預知的唯一的規則就是:我們知道有一個目標,有一個(或結束的元素) 。我需要獲得所有標籤,並排除所有其他標籤。

有了這個爲例,我需要得到HTML如下:

<h2 class="target">foo</h2> 
<p>bla bla</p> 
<ul> 
    <li>bar1</li> 
    <li>bar2</li> 
    <li>bar3</li> 
</ul> 

這樣我就可以得到:target = page.at('#exemple .target') 我知道next_sibling方法,但我怎麼可以測試當前節點的標籤的類型?

我想類似的東西當然節點樹:

html = '' 
while not target.is_a? 'h4' 
    html << target.inner_html 
    target = target.next_sibling 

我怎樣才能做到這一點?

+1

這更多的是一個[標籤:XPath]中的或[標籤:CSS選擇器]的問題比它大約機械化。如果你添加了這些,你會得到更多的觀衆。 –

回答

1

你可以從你的節點集中減去你不想要的值:

h2 = page.at('h2') 
(h2.search('~ *') - h2.search('~ h4','~ h4 ~ *')).each do |el| 
    # el is not a h4 and does not follow a h4 
end 

也許它使用xpath更有意義,但我可以做到這一點沒有谷歌搜索。

你遍歷一個同級可以工作過的想法:

el = page.at('h2 ~ *') 
while el && el.name != 'h4' 
    # do something with el 
    el = el.at('+ *') 
end 
+0

Thx,我不知道是如此容易得到類型的標籤(使用'.name')。我的用例給了這個:'el = page.at('#Nom_commun')。parent html = el.inner_html el = el.at('+ *') while el && el.name!='h4' html << el.inner_html el = el.at('+ *') end' – Matrix

1

看起來你想要返回h2元素及其後續的兄弟姐妹。我不清楚您是要保留還是丟棄h4;如果你想保持它的XPath是:

//h2[@class="target"] | //h2[@class="target"]/following-sibling::* 

如果需要排除h4

//h2[@class="target"] | //h2[@class="target"]/following-sibling::*[not(self::h4)] 

編輯:如果您需要排除h4和任何超越:

//h2[@class="target"] | //h2[@class="target"]/following-sibling::*[not(self::h4) | not(preceding-sibling::h4)] 
+0

這不完全是它,它需要停在'h4',而不僅僅是排除它。 – pguardiario

+0

我編輯的問題,關於不精確性,但我們不知道有多少和現有標記類型

,所以我需要忽略自

(包含)以來的所有標記。我無法做一個固定的xpath cmd,因爲內容是動態的和不可預測的! – Matrix

+0

@Matrix你當然可以在XPath中做到這一點!看我的編輯。 –

相關問題