【问题标题】:Get element's text with CDATA使用 CDATA 获取元素的文本
【发布时间】:2019-11-01 08:31:24
【问题描述】:

说,我有一个元素:

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

我想得到的是&lt;![CDATA[content]]&gt;。我该怎么办?

【问题讨论】:

  • this 可能会有所帮助
  • 我想"&lt;![CDATA[{}]]&gt;".format(el.text) 不是一个选项?
  • @SebastienD 不是一个选项,我想确保在测试中内容包含在 CDATA 中。
  • 好的,发布了一个检查该问题的答案

标签: python xml lxml cdata


【解决方案1】:

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

【讨论】:

  • 有没有办法用lxml 做到这一点?或者是否有任何测试库使用beautifulsoup?我想避免混合不同的库?虽然我必须承认,我现在使用的那个 (xmlunittest) 质量有问题。我还不擅长编写测试,但看起来是这样。
【解决方案2】:

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

【讨论】:

  • 更准确地说,re.sub(r'^&lt;[^&gt;]+&gt;|&lt;/[^&gt;]+&gt;$', '', etree.tostring(el, with_tail=False).decode())。至少我认为没有更好的办法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多