如何使用Nokogiri从HTML中删除不需要的标签?
问题描述:
我需要去除文档中的所有字体标签。当试图用下面的Ruby代码来实现时,字体标签中的其他元素和文本会丢失。我还尝试遍历所有子元素,并在解除字体标记之前使它们成为字体标记的兄弟,这也会导致HTML丢失。去除可以包含其他元素和/或文本的标签的好方法是什么?如何使用Nokogiri从HTML中删除不需要的标签?
doc.css('font').each do |element|
element.unlink
end
UPDATE(响应于第一溶液):
使用node.children获得孩子,然后移动孩子到字体节点的父节点的问题是,没有一个孩子节点包括在字体节点中找到的文本。只要字体标签被删除(取消链接),字体标签中的所有文本也会从文档中消失。
我修改后的问题是:我如何使用Nokogiri来获取字体节点的文本,以及如何在字体节点的位置上移动此文本以替换字体标记。
答
问题是你砍掉节点,它也会修剪子节点。您需要保留这些子项,然后将它们附加到父节点。完成之后,您可以删除目标节点。
看看“替换节点VV /儿童” - http://rubyforge.org/pipermail/nokogiri-talk/2009-June/000333.html
在该消息亚伦在谈论取代XML节点,但一旦一个HTML文档已被引入nokogiri解析它是完全一样的。你需要做一些小的调整,但它应该让你去。
答
我创建了一个基于您的评论的代码更通用的解决方案:
module Filter
def remove_tags_preserve_content!(*list)
xpath('.//*').each do |element|
if list.include?(element.name)
element.children.reverse.each do |child|
child_clone = child.clone
element.add_next_sibling child_clone
child.unlink
end
element.unlink
end
end
end
end
class Nokogiri::XML::Element
include Filter
end
class Nokogiri::XML::NodeSet
include Filter
end
# === Example ===
doc.remove_tags_preserve_content!('font')
谢谢。这与所需要的非常接近。使用HTML内容时,节点的排序很重要。将节点附加到父节点可能最终会导致节点不处于原始顺序。 – sutch 2010-03-17 22:38:20