如何使用Nokogiri从HTML中删除不需要的标签?

时间:2010-03-17 18:55:25

标签: ruby nokogiri

我需要从文档中删除所有字体标记。尝试使用以下Ruby代码执行此操作时,字体标记中的其他元素和文本将丢失。我还尝试迭代所有子元素,并在取消链接字体标记之前使其成为字体标记的兄弟元素 - 这也会导致丢失HTML。删除可包含其他元素和/或文本的标记的好方法是什么?

  doc.css('font').each do |element|
    element.unlink
  end

更新(回应第一个解决方案):

使用node.children获取子项然后将子项移动到字体节点的父节点的问题是,没有子节点包含在字体节点中找到的文本。删除(取消链接)字体标记后,字体标记中的所有文本也会从文档中消失。

我修改后的问题是:如何使用Nokogiri获取字体节点的文本以及如何移动此文本以替换字体节点位置中的字体标记。

2 个答案:

答案 0 :(得分:6)

我根据你评论中的代码创建了一个更通用的解决方案:

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')

答案 1 :(得分:4)

问题是你正在砍掉节点,节点也会修剪子节点。您需要保留子项,然后将它们附加到父节点。完成后,您可以删除目标节点。

查看“替换孩子的节点” - http://rubyforge.org/pipermail/nokogiri-talk/2009-June/000333.html

在那条消息中,Aaron正在谈论替换XML节点,但是一旦Nokogiri解析了HTML文档,它就完全相同了。你需要做一些小的调整,但它应该让你去。