在Python中处理XML时,经常会碰到文本节点里夹杂着HTML实体的情况,例如<、>、&等。这些实体在XML里本应被转义,但有些数据源会把HTML实体直接写进XML文本,导致解析后拿到的是原始实体字符串而非真实字符。下面介绍几种实用处理方式。

使用标准库进行解析与解码
Python内置的xml.etree.ElementTree可以正常解析XML,但默认不会把HTML实体转成字符。我们可以先用它提取文本,再用html.unescape处理。
import xml.etree.ElementTree as ET
import html
xml_data = '<root><item>价格: 12 & 34 < 50</item></root>'
root = ET.fromstring(xml_data)
raw_text = root.find('item').text
# raw_text为 "价格: 12 & 34 < 50"
decoded_text = html.unescape(raw_text)
# decoded_text为 "价格: 12 & 34 < 50" 中实体被还原
print(decoded_text)
处理含HTML实体的不规范XML
当XML本身因为HTML实体出现格式问题,标准解析器会报错。此时可以用html.parser先当HTML读,再提取内容。
from html.parser import HTMLParser
class XmlEntityParser(HTMLParser):
def __init__(self):
super().__init__()
self.texts = []
def handle_data(self, data):
self.texts.append(data)
parser = XmlEntityParser()
parser.feed('<msg>hello & world</msg>')
print(''.join(parser.texts))
常见实体对照
| 实体名 | 含义 | 字符 |
|---|---|---|
| < | 小于号 | < |
| > | 大于号 | > |
| & | 和号 | & |
使用第三方库容错
如果数据复杂,可安装lxml库,它支持更宽松的解析,并结合html.unescape做二次处理,能有效减少报错。
注意:在XML中写<code>这类标签名时,应按规则转义为<code>,避免解析冲突。
小结
核心思路是先拿到原始文本,再统一做HTML实体解码。只要分清XML转义和HTML实体的层级,Python处理起来并不复杂。
PythonXMLHTML_entity修改时间:2026-07-30 08:21:16