2015-05-21 68 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