如何使用xml.etree.ElementTree将HTML内容写入XML文件?
问题原因
Python标准库的xml.etree.ElementTree模块默认会自动转义文本内容中的XML特殊字符(<、>、&等),你直接把拼接好的CDATA字符串赋值给元素的text属性时,里面的<会被转义为<,最终输出就出现了&lt;的双重转义问题,和预期输出不符。
方案1:使用标准库,自定义CDATA序列化逻辑
不需要额外安装第三方库,给标准库扩展CDATA支持即可:
- 在创建元素之前添加如下注册代码:
import xml.etree.ElementTree as ET # 定义CDATA节点构造方法 def CDATA(content): cdata_elem = ET.Element('![CDATA[') cdata_elem.text = content return cdata_elem # 重写序列化逻辑,识别CDATA节点 ET._original_serialize = ET._serialize_xml def custom_serialize(write, elem, qnames, namespaces, short_empty_elements, **kwargs): if elem.tag == '![CDATA[': write(f"<![CDATA[{elem.text}]]>") if elem.tail: write(ET._escape_cdata(elem.tail)) return return ET._original_serialize(write, elem, qnames, namespaces, short_empty_elements, **kwargs) ET._serialize_xml = custom_serialize
- 替换原有的赋值逻辑,不要手动拼接CDATA标签:
qtext = ET.SubElement(questiontext, 'text') # 直接传入要嵌入的HTML内容即可,不需要额外加CDATA标签 qtext.append(CDATA('<div class="qtext"></div>'))
- 原有文件保存代码不需要修改,运行后即可得到符合要求的XML文件。
方案2:使用lxml库(更简洁)
如果可以接受安装第三方库,lxml原生支持CDATA,使用更简单:
- 先安装依赖:
pip install lxml - 替换导入和赋值逻辑即可:
from lxml import etree as ET # 其他创建元素的逻辑和标准库用法基本一致 qtext = ET.SubElement(questiontext, 'text') # 直接用内置的CDATA方法包裹HTML内容 qtext.text = ET.CDATA('<div class="qtext"></div>')
保存文件的逻辑和原来一致,输出即可符合要求。
内容的提问来源于stack exchange,提问作者rezoThePriest
相关产品推荐
相关产品推荐

