2010-03-17 94 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')