【问题标题】:How can unwanted tags be removed from HTML using Nokogiri?如何使用 Nokogiri 从 HTML 中删除不需要的标签?
【发布时间】:2010-03-17 18:55:24
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ruby nokogiri


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      在那条消息中,Aaron 正在谈论替换 XML 节点,但是一旦 HTML 文档被 Nokogiri 解析,这一切都是一样的。你需要做一些小的调整,但它应该能让你继续前进。

      【讨论】:

      • 谢谢。这与需要的非常接近。对于 HTML 内容,节点的顺序很重要。将节点附加到父节点可能会导致节点不在原始顺序中。
      猜你喜欢
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 2013-07-30
      • 2012-02-20
      相关资源
      最近更新 更多