如何使用Nokogiri在连续的h2标签之间拆分内容并将其包装在章节div下

时间:2015-03-08 14:07:24

标签: ruby nokogiri

我想将文档拆分为“章节”。章节从h2开始,包括所有兄弟姐妹,但不包括下一个h2标签。

即。鉴于此

<div id="content">
  <h2>First</h2>
  <p>one</p>
  <h2>Second</h2>
  <p>two</p>
  <h2>Third</h2>
</div>

我想要这个

<div id="dad">
  <div class="chapter">
    <h2>First</h2>
    <p>one</p>
  </div>
  <div class="chapter">
    <h2>Second</h2>
    <p>two</p>
  </div>
  <div class="chapter">
    <h2>Third</h2>
  </div>
</div>

虽然我已经使用Nokogiri和xml进行了一些基本的操作,但我正在敲打我的标题,想知道如何首先将节点分组为章节块,然后用章节div将它们包装到位。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您应该按标题对节点进行分组(包括相关的子节点),然后将它们转换为输出格式。

以下是对节点进行分组的算法的概念:

array = [
  :header,
  :text,
  :text,
  :header,
  :text,
  :header,
  :text,
  :text,
]

groupped_array = array.reduce([]) do |res, item|
  res.tap do 
    res << [] if item == :header
    res.last << item
  end
end

p groupped_array

结果:

➜  ruby group_nodes.rb
[[:header, :text, :text], [:header, :text], [:header, :text, :text]]

我认为你可以在这里添加nokogiri而不会出现大问题,并将结果转换为输出格式。