Подтвердить что ты не робот

В lxml, как удалить тег, но сохранить все содержимое?

Проблема заключается в следующем: у меня есть такой XML-фрагмент:

<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>

В результате я хочу удалить все теги <a> - и <c> -Tags, но сохранить их (текстовые) -контенты и дочерние элементы так же, как они есть. Кроме того, элемент <b> -Element должен оставаться нетронутым. Результат должен выглядеть таким образом

<fragment>text1 inner<d>1</d> text2 <b>inner2</b> text3</fragment>

В настоящее время я вернусь к очень грязному трюку: я создам etree.tostring фрагмент, удаляю оскорбительные теги через регулярное выражение и заменим исходный фрагмент результатом etree.fromstring этого (а не реальный код, но должен выглядеть примерно так:

from lxml import etree
fragment = etree.fromstring("<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>")
fstring = etree.tostring(fragment)
fstring = fstring.replace("<a>","")
fstring = fstring.replace("</a>","")
fstring = fstring.replace("<c>","")
fstring = fstring.replace("</c>","")
fragment = etree.fromstring(fstring)

Я знаю, что, возможно, я могу использовать xslt для этого, и я знаю, что lxml может использовать xslt, но должен быть более собственный подход lxml?

Для справки: я попытался попасть туда с lxml element.replace, но так как я хочу вставить текст, где раньше был элемент node, я не думаю, что смогу это сделать.

4b9b3361

Ответ 2

Используйте функцию Cleaner для lxml для удаления тегов из содержимого html. Ниже приведен пример того, что вы хотите. Для HTML-документа Cleaner - лучшее общее решение проблемы, чем использование strip_elements, потому что в таких случаях вы хотите вырезать больше, чем только тег; вы также хотите избавиться от таких вещей, как атрибуты onclick = function() для других тегов.

import lxml
from lxml.html.clean import Cleaner
cleaner = Cleaner()
cleaner.remove_tags = ['p']
remove_tags:

Список тегов для удаления. Только теги будут удалены, их содержимое будет втянуто в родительский тег.