Python如何转换含HTML实体的XML,正常显示特殊字符ñ
解决Python转换带HTML实体的XML问题
嘿,这个问题我之前帮朋友处理过,本质就是把那些被拆成HTML实体的UTF-8字节还原成正确的字符。下面给你两种实用的实现方式,都能得到你想要的结果:
方法一:直接处理字符串
这种方式适合快速处理单个XML字符串,步骤很清晰:
- 先用
html.unescape把HTML实体转换成对应的字符; - 再通过编码转换把这些字符还原成正确的UTF-8字符。
代码示例:
import html # 你的原始XML内容 raw_xml = '<user> <name>mariap</name> <full-name>Maria Peña</full-name> <uid>2007</uid> <class>super-user</class> </user>' # 第一步:解析HTML实体,得到包含临时字符的字符串 unescaped_str = html.unescape(raw_xml) # 第二步:将临时字符按latin-1编码为字节,再解码为UTF-8,还原出ñ fixed_xml = unescaped_str.encode('latin-1').decode('utf-8') # 输出结果 print(fixed_xml)
方法二:结合XML解析器处理
如果你的XML内容更复杂,需要后续操作XML节点,这种方式更合适:先处理实体还原字符,再用XML解析器解析和输出。
代码示例:
import html import xml.etree.ElementTree as ET raw_xml = '<user> <name>mariap</name> <full-name>Maria Peña</full-name> <uid>2007</uid> <class>super-user</class> </user>' # 先还原HTML实体和UTF-8字符 unescaped_str = html.unescape(raw_xml) fixed_content = unescaped_str.encode('latin-1').decode('utf-8') # 解析XML并输出格式化内容 root = ET.fromstring(fixed_content) ET.dump(root)
为什么这么做?
你看到的ñ其实是ñ的UTF-8字节(0xC3和0xB1)被分别转换成了HTML实体。先用html.unescape得到对应的字符(Ã和±),再用latin-1编码把这些字符转回原始字节,最后解码成UTF-8就得到了正确的ñ。
内容的提问来源于stack exchange,提问作者Nitin Kr
相关产品推荐
相关产品推荐

