我正在使用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
永远不会被访问,因为父级已经重建了它的内容,并且它没有研究更新的节点。
有没有办法可以更新父节点,并且仍然可以在下一个循环中访问子节点?
答案 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