我有下面的超文本标记语言结构,我想找到下面所有出现在<div>xyz</div>之后直到超文本标记语言的最后一个节点的兄弟节点和节点:
<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>我用过
xpath('//div[contains(text(), "xyz")]/following-sibling::*')但是它并没有返回所有的节点,它只给出了<p>bbb</p><b>hhhh</b>节点。
我期望得到以下输出:
<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>如何获取出现在特定节点之后的所有节点?
发布于 2015-04-20 04:34:54
从HTML或XML中提取信息最困难的事情之一是确定从哪里开始捕获。如果你想捕获大量相似的节点,那么从所需节点上开始,然后向下工作,然后删除你不想要的节点,通常比零散地工作并尝试重建一些结构更容易。
我会这样做:
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]这会导致:
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>注意:
<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
已经为此创建了错误报告。
https://stackoverflow.com/questions/29726756
复制相似问题