Nokogiri 搜索文档并修改父节点并且无法访问子节点
Nokogiri search over a document and modify parent node and can't access child node
我正在使用 nokogiri 通过 css
方法搜索 HTML 文档。当我找到一个元素时,我通过将它包装在另一个元素中并将其重新插入到该节点中来修改它。问题是如果该元素包含我正在搜索的带有 class 的子节点,因为我修改了父节点,它会跳过子节点。
这里有一个例子来帮助解释。
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
永远不会被访问,因为父级已经重建了它的内容并且它没有研究更新的节点。
有没有一种方法可以更新父节点并在下一个循环中仍然可以访问子节点?
通过同事的一些咨询,我找到了自己问题的答案。问题是我们正在从 parent 修改为 child。我真正想做的是从 child 修改为 parent 这样我就不会弄乱任何内容。
为此,我按照元素具有的祖先数量的相反顺序对节点列表进行排序。
# 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
我正在使用 nokogiri 通过 css
方法搜索 HTML 文档。当我找到一个元素时,我通过将它包装在另一个元素中并将其重新插入到该节点中来修改它。问题是如果该元素包含我正在搜索的带有 class 的子节点,因为我修改了父节点,它会跳过子节点。
这里有一个例子来帮助解释。
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
永远不会被访问,因为父级已经重建了它的内容并且它没有研究更新的节点。
有没有一种方法可以更新父节点并在下一个循环中仍然可以访问子节点?
通过同事的一些咨询,我找到了自己问题的答案。问题是我们正在从 parent 修改为 child。我真正想做的是从 child 修改为 parent 这样我就不会弄乱任何内容。
为此,我按照元素具有的祖先数量的相反顺序对节点列表进行排序。
# 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