使用以下标记,我需要获得中间的tr's
<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> </td>
<td> </td>
...
</tr>
表示<tr class="H03">
和<tr class="report_total">
之间的所有兄弟tr。我使用的是mechanize和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符完全被淹没了!
您可以尝试以下xpath:
//tr[@class='H03']/following-sibling::tr[following-sibling::tr[@class='report_total']]
以上xpath选择tr[@class='H03']
之后的所有<tr>
,其中<tr>
在tr[@class='report_total']
之后,也就是说选中的<tr>
位于tr[@class='report_total']
之前。
Mechanize提供了一些有用的辅助方法。
假设你正在做下面的事情:
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数组中。