Как удалить ненужные теги из HTML с помощью Nokogiri? - PullRequest
2 голосов
/ 17 марта 2010

Мне нужно удалить все теги шрифтов из документа. При попытке сделать это с помощью следующего кода Ruby другие элементы и текст в тегах шрифта теряются. Я также попытался перебрать все дочерние элементы и сделать их родственными элементами тега шрифта, прежде чем отсоединять тег шрифта, что также приводит к потере HTML. Каков хороший метод удаления тегов, которые могут содержать другие элементы и / или текст?

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

ОБНОВЛЕНИЕ (в ответ на первое решение):

Проблема с использованием node.children для получения дочерних элементов и их перемещения в родительский узел узла шрифта заключается в том, что ни один из дочерних узлов не содержит текст, найденный внутри узла шрифта. Как только тег шрифта будет удален (не связан), весь текст в теге шрифта также исчезнет из документа.

Мой пересмотренный вопрос таков: как мне использовать Nokogiri для получения текста узла шрифта и как можно перемещать этот текст для замены тега шрифта в позиции узла шрифта.

Ответы [ 2 ]

6 голосов
/ 02 февраля 2011

Я создал более общее решение на основе кода в вашем комментарии:

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')
4 голосов
/ 17 марта 2010

Проблема в том, что вы отключаете узел, который также обрезает дочерние узлы. Вам нужно сохранить дочерние элементы, а затем добавить их в родительский узел. После этого вы можете удалить целевой узел.

Взгляните на «Заменить узел с детьми» - http://rubyforge.org/pipermail/nokogiri-talk/2009-June/000333.html

В этом сообщении Аарон говорит о замене узлов XML, но все равно, когда документ HTML анализируется Nokogiri. Вам нужно будет сделать несколько мелких настроек, но это должно помочь вам.

...