2015-05-21 87 views
0

之間得到兄弟姐妹下面的標記,我需要得到中間TR的XPath來兩個元素

<tr class="H03"> 
    <td>Artist</td> 
    ... 
<tr class="row_alternate"> 
    <td>LIMP</td> 
    <td>Orion</td> 
    ... 
</tr> 
<tr class="row_normal"> 
    <td>SND</td> 
    <td>Tender Love</td> 
    ... 
</tr> 
<tr class="report_total"> 
    <td>&nbsp;</td> 
    <td>&nbsp;</td> 
    ... 
</tr> 

這是每一個兄弟姐妹TR <tr class="H03"><tr class="report_total">之間。我正在使用機械化和nokogiri,所以只限於他們的xpath支持。尋找不同的StackOverflow問題後,我的最好的嘗試是

page.search('/*/tr[@class="H03"]/following-sibling::tr[count(. | /*/tr[@class="report_total"]/preceding-sibling::tr)=count(/*/tr[@class="report_total"]/preceding-sibling::tr)]') 

它返回一個空數組,並且是如此可笑的複雜,我有限的XPath福是完全壓倒!

回答

1

機械化在這裏有幾個輔助方法,這將有助於僱用。

假設你正在做的事情如下所示:

require 'mechanize' 
agent = Mechanize.new 
page = agent.get('http://www.website.com') 
start_tr = page.at('.H03') 

此時,TR將是你在你的問題列出了第一TR的引入nokogiri XML元素。

您可以再通過兄弟姐妹迭代:

next_tr = start_tr.next_sibling 

這樣做,直到你打的要停止TR。

trs = Array.new 

until next_tr.attributes['class'].name == 'report_total' 
    next_tr = next_tr.next_sibling 
    trs << next_tr 
end 

如果你想的範圍是包容性的開始和停止TRS(H03和report_total)剛剛調整上面的代碼,包括他們的TRS陣列英寸

+0

謝謝你的回答。這工作很好,並介紹了我在機械化的東西,我不熟悉。 – diabolist

1

你可以嘗試以下XPath:

//tr[@class='H03']/following-sibling::tr[following-sibling::tr[@class='report_total']] 

以上的XPath選擇所有<tr>以下tr[@class='H03'],其中<tr>具有以下同級tr[@class='report_total']或選擇<tr>換句話說位於tr[@class='report_total']之前。

+0

非常感謝,非常感謝 – diabolist