使用CDATA获取元素的文本

时间:2019-06-18 16:30:35

标签: python xml lxml cdata

说,我有一个元素:

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

我想要得到的是<![CDATA[content]]>。我该怎么办?

2 个答案:

答案 0 :(得分:3)

当您执行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中”的要求。

答案 1 :(得分:2)

您可以考虑使用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]]>