2010-03-17 49 views
2

我需要去除文档中的所有字体标签。当试图用下面的Ruby代码来实现时,字体标签中的其他元素和文本会丢失。我还尝试遍历所有子元素,并在解除字体标记之前使它们成为字体标记的兄弟,这也会导致HTML丢失。去除可以包含其他元素和/或文本的标签的好方法是什么?如何使用Nokogiri从HTML中删除不需要的标签?

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

UPDATE(响应于第一溶液):

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

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

回答

4

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

看看“替换节点VV /儿童” - http://rubyforge.org/pipermail/nokogiri-talk/2009-June/000333.html

在该消息亚伦在谈论取代XML节点,但一旦一个HTML文档已被引入nokogiri解析它是完全一样的。你需要做一些小的调整,但它应该让你去。

+0

谢谢。这与所需要的非常接近。使用HTML内容时,节点的排序很重要。将节点附加到父节点可能最终会导致节点不处于原始顺序。 – sutch 2010-03-17 22:38:20

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') 
相关问题