首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取特定标签后面的所有节点

如何获取特定标签后面的所有节点
EN

Stack Overflow用户
提问于 2015-04-19 14:53:17
回答 1查看 97关注 0票数 0

我有下面的超文本标记语言结构,我想找到下面所有出现在<div>xyz</div>之后直到超文本标记语言的最后一个节点的兄弟节点和节点:

代码语言:javascript
复制
<html>
  <head>
  </head>
  <body>
    <div id="page-container">
     <div id="page-1">
       <p> abc <p>
       <div>xyz</div>
       <p>bbb</p>
       <b>hhhh</b>
     </div>
     <div  id="page-2">
      <p>hhhh</p>
      <span>abc</span>
      <p> gggg </p>
     </div>
     <div  id="page-3">
      <p>hhhh</p>
      <span>abc</span>
      <p> gggg </p>
     </div>
    </div>
  </body>
</html>

我用过

代码语言:javascript
复制
xpath('//div[contains(text(), "xyz")]/following-sibling::*')

但是它并没有返回所有的节点,它只给出了<p>bbb</p><b>hhhh</b>节点。

我期望得到以下输出:

代码语言:javascript
复制
<div id="page-container">
  <div id="page-1">
     <div>xyz</div>
      <p>bbb</p>
      <b>hhhh</b>
     </div>
   <div  id="page-2">
     <p>hhhh</p>
     <span>abc</span>
     <p> gggg </p>
   </div>
   <div  id="page-3">
     <p>hhhh</p>
     <span>abc</span>
     <p> gggg </p>
   </div>
 </div>

如何获取出现在特定节点之后的所有节点?

EN

回答 1

Stack Overflow用户

发布于 2015-04-20 04:34:54

从HTML或XML中提取信息最困难的事情之一是确定从哪里开始捕获。如果你想捕获大量相似的节点,那么从所需节点上开始,然后向下工作,然后删除你不想要的节点,通常比零散地工作并尝试重建一些结构更容易。

我会这样做:

代码语言:javascript
复制
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<html>
  <head>
  </head>
  <body>
    <div id="page-container">
     <div id="page-1">
       <p> abc <p>
       <div>xyz</div>
       <p>bbb</p>
       <b>hhhh</b>
     </div>
     <div  id="page-2">
      <p>hhhh</p>
      <span>abc</span>
      <p> gggg </p>
     </div>
     <div  id="page-3">
      <p>hhhh</p>
      <span>abc</span>
      <p> gggg </p>
     </div>
    </div>
  </body>
</html>
EOT

page_container = doc.at('#page-container')
page1 = page_container.at('#page-1')
page1.children = page1.children[3..-1]

这会导致:

代码语言:javascript
复制
puts page_container.to_html
# >> <div id="page-container">
# >>      <div id="page-1">
# >> <div>xyz</div>
# >>        <p>bbb</p>
# >>        <b>hhhh</b>
# >>      </div>
# >>      <div id="page-2">
# >>       <p>hhhh</p>
# >>       <span>abc</span>
# >>       <p> gggg </p>
# >>      </div>
# >>      <div id="page-3">
# >>       <p>hhhh</p>
# >>       <span>abc</span>
# >>       <p> gggg </p>
# >>      </div>
# >>     </div>

注意:

  • 我使用CSS选择器,而不是XPath。
  • 我在“XPath -1”目录中使用了一个偏移量来跳过前三个节点:有一个文本节点,后面是<p>节点和另一个文本节点:

page_container.at('#page-1').children0,3 # => [#,#>,#>]

  • 我通常会使用remove来摆脱<p> abc <p>,但我在Nokogiri 1.6.6.2中看到了一个看起来像是错误的东西,结果是:

page_container.at('#page-1 p').remove将page_container.to_html # >> xyz

已经为此创建了错误报告。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29726756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档