Получить текст элемента с CDATA - PullRequest
1 голос
/ 18 июня 2019

Скажем, у меня есть элемент:

>>> el = etree.XML('<tag><![CDATA[content]]></tag>')
>>> el.text
'content'

Я бы хотел получить <![CDATA[content]]>.Как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 18 июня 2019

Когда вы делаете el.text, это всегда даст вам простой текст content.

Чтобы увидеть сериализованный элемент, попробуйте tostring() вместо:

el = etree.XML('<tag><![CDATA[content]]></tag>')
print(etree.tostring(el).decode())

это напечатает:

<tag>content</tag>

Для сохранения CDATA необходимо использовать XMLParser() с strip_cdata=False:

parser = etree.XMLParser(strip_cdata=False)

el = etree.XML('<tag><![CDATA[content]]></tag>', parser=parser)
print(etree.tostring(el).decode())

Будет напечатано:

<tag><![CDATA[content]]></tag>

Этого должно быть достаточно для выполнения вашего требования ". Я хочу убедиться в тесте, что содержимое упаковано в CDATA ".

2 голосов
/ 18 июня 2019

Вы можете рассмотреть возможность использования BeautifulSoup и искать CDATA экземпляров:

import bs4
from bs4 import BeautifulSoup

data='''<tag><![CDATA[content]]></tag>'''
soup = BeautifulSoup(data, 'html.parser')
"<![CDATA[{}]]>".format(soup.find(text=lambda x: isinstance(x, bs4.CData)))

Вывод

<![CDATA[content]]>
...