Nokogiri搜索文档并修改父节点,无法访问子节点

时间:2017-10-30 02:14:02

标签: ruby nokogiri

我正在使用nokogiri使用css方法搜索HTML文档。当我找到一个元素时,我通过将其包装在另一个元素中并将其重新插入该节点来修改它。问题是,如果该元素包含具有我正在搜索的类的子节点,因为我修改了父节点,它会跳过子节点。

这是一个帮助解释的例子。

html_string = <<-HEREDOC
  <div class="mt-1 parent-div">
    <div class="mt-1 child-div">Hello</div>
  </div>
HEREDOC

doc = Nokogiri::HTML(html_string)
doc.css('.mt-1').each do |node|
  node.replace(Nokogiri::HTML::DocumentFragment.parse("<div>#{node.to_html}</div>"
end

child-div永远不会被访问,因为父级已经重建了它的内容,并且它没有研究更新的节点。

有没有办法可以更新父节点,并且仍然可以在下一个循环中访问子节点?

1 个答案:

答案 0 :(得分:0)

我从同事的一些咨询中找到了我自己问题的答案。问题是我们正在从父母修改为儿童。我真正想做的是从孩子到父母的修改,这样我就不会弄乱任何内容。

为此,我按照元素祖先数量的相反顺序对节点列表进行排序。

# the key change -> .sort_by{ |n| n.ancestors.size }.reverse!    
doc.css('.mt-1').sort_by{ |n| n.ancestors.size }.reverse!.each do |node|
  node.replace(Nokogiri::HTML::DocumentFragment.parse("<div>#{node.to_html}</div>"
end