如何使用Nokogiri获取特定标签之后的所有节点

时间:2014-12-17 14:04:20

标签: ruby ruby-on-rails-4 xpath nokogiri

我想获取特定标记之后的所有HTML标记。例如:

<html>
    <body>
       <p>one</p>
       <u><p>Two</p></u>
       <b><p>Three</p></b>
       <p>Four</p>
       <table>
          <tr><td>Five</td></tr>
          <tr><td>Six</td></tr>
       </table>
    </body>
</html>

我想要使用Nokogiri <u><p>Two</p></u>之后的所有HTML标记。

我的结果应该是:

<b><p>Three</p></b>
<p>Four</p>
<table>
   <tr><td>Five</td></tr>
   <tr><td>Six</td></tr>
</table>

1 个答案:

答案 0 :(得分:1)

following-sibling XPath axis就是你想要的。您的示例不是有效的HTML,Nokogiri会在解析为HTML时更改它,因此难以使用它进行演示,但使用类似的代码:

<html>
    <body>
       <p>one</p>
       <p>Two</p>
       <p>Three</p>
       <p>Four</p>
       <table>
          <tr><td>Five</td></tr>
          <tr><td>Six</td></tr>
       </table>
    </body>
</html>

这个XPath表达式:

//p[.="Two"]/following-sibling::*

将选择此项:

<p>Three</p>
<p>Four</p>
<table>
          <tr><td>Five</td></tr>
          <tr><td>Six</td></tr>
       </table>

您可能希望使用node()而不是*,这将选择所有文本节点和元素(包括仅空白节点):

<p>Three</p>
<p>Four</p>
<table>
  <tr><td>Five</td></tr>
  <tr><td>Six</td></tr>
</table>

(如果你这样做的话,每行会有更多的前导空格,我已经把它删除了。)