XPath获取两个元素之间的兄弟关系



使用以下标记,我需要获得中间的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>&nbsp;</td>
  <td>&nbsp;</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数组中。

相关内容

  • 没有找到相关文章

最新更新