Удалите корневой тег из xml / html, используя tostring () из lxml - PullRequest
2 голосов
/ 18 октября 2019

Как сделать HTML-текст без корневого тега (обычно это <html></html>)? К примеру, для использования в CDATA:

<![CDATA[<div class="foo"></div><p>bar</p>]]>

Мой код:

from lxml import etree

html = etree.Element('root')
etree.SubElement(html, 'div', attrib={'class':'foo'})
etree.SubElement(html, 'p').text='bar'

t = etree.tostring(html)
# '<root><div class="foo"/><p>bar</p></root>'

Я бы не хотел использовать регулярные выражения для удаления корневого тега.

1 Ответ

0 голосов
/ 19 октября 2019

Если вам нужно текстовое представление всех подэлементов без корневого элемента, вы можете сделать:

subels = ''.join([etree.tostring(el).decode('ascii') for el in html])

, где html - это Element вашего вопроса. В этом случае subels является строкой:

'<div class="foo"/><p>bar</p>'

Это может быть улучшено, чтобы получать только определенные теги, используя метод iter. Например:

subels = ''.join([etree.tostring(el).decode('ascii') for el in html.iter('div', 'p'])

вернет только теги 'div' и 'p', поэтому, если бы были другие теги, они были бы опущены.
Вы можете использовать его для фильтрации нежелательных тегов. , но будьте осторожны, потому что это может нарушить иерархию документа: он по-прежнему возвращает дочерние теги нежелательных тегов.

РЕДАКТИРОВАТЬ после комментариев

Если корневой тег имеет текстовую информацию, которую вы хотите сохранитьПросто добавьте его обратно.

subels = ''.join([html.text] + [etree.tostring(el).decode('ascii') for el in html])
...