You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用xml.etree.ElementTree将HTML内容写入XML文件?

问题原因

Python标准库的xml.etree.ElementTree模块默认会自动转义文本内容中的XML特殊字符(<、>、&等),你直接把拼接好的CDATA字符串赋值给元素的text属性时,里面的<会被转义为&lt;,最终输出就出现了&amp;lt;的双重转义问题,和预期输出不符。


方案1:使用标准库,自定义CDATA序列化逻辑

不需要额外安装第三方库,给标准库扩展CDATA支持即可:

  1. 在创建元素之前添加如下注册代码:
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
  1. 替换原有的赋值逻辑,不要手动拼接CDATA标签:
qtext = ET.SubElement(questiontext, 'text')
# 直接传入要嵌入的HTML内容即可,不需要额外加CDATA标签
qtext.append(CDATA('<div class="qtext"></div>'))
  1. 原有文件保存代码不需要修改,运行后即可得到符合要求的XML文件。

方案2:使用lxml库(更简洁)

如果可以接受安装第三方库,lxml原生支持CDATA,使用更简单:

  1. 先安装依赖:
    pip install lxml
  2. 替换导入和赋值逻辑即可:
from lxml import etree as ET

# 其他创建元素的逻辑和标准库用法基本一致
qtext = ET.SubElement(questiontext, 'text')
# 直接用内置的CDATA方法包裹HTML内容
qtext.text = ET.CDATA('<div class="qtext"></div>')

保存文件的逻辑和原来一致,输出即可符合要求。


内容的提问来源于stack exchange,提问作者rezoThePriest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 09:36:01