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

ема заключается в следующем: у меня есть фрагмент XML, например, так:

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

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

<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?

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

Ответы на вопрос(2)

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

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

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

Решение Вопроса

Попробуй это:http://lxml.de/api/lxml.etree-module.html#strip_tags

>>> etree.strip_tags(fragment,'a','c')
>>> etree.tostring(fragment)
'<fragment>text1 inner1 text2 <b>inner2</b> text3</fragment>'
 Jens06 апр. 2013 г., 04:29
Именно то, что я искал. Еще лучше, strip_tags () принимает подстановочные знаки, так что передача"*" как тег удаляет все теги из дерева. Полностью.
 Kabie01 мар. 2011 г., 18:21
@ mkelley33: не могу это сделать. Рад, что это помогло, хотя.
 mkelley3301 мар. 2011 г., 05:03
Также потрясающе:etree.strip_elements(fragment, *['tag1', 'tag2'])
 mkelley3301 мар. 2011 г., 05:02
Шутки в сторону. Собираетесь ли вы быть на PyCon 2011? Если так, позвольте мне купить вам пиво или любой другой напиток, который вы предпочитаете. Вы только что сделали мою ночь :)
 Thor13 янв. 2011 г., 16:27
Спасибо, это работает отлично. Термин «полоса» мне не приходил в голову, или я мог бы найти ответ сам :)

Ваш ответ на вопрос