使用utf8以外的编码在Python中解析XML

2024-09-28 05:25:12 发布

您现在位置:Python中文网/ 问答频道 /正文

关于如何在python中解析包含:encoding='Windows-1255'的xml有什么线索吗? 至少lxml.etree当XML头中的“encoding”标记不是“utf-8”或“ASCII”时,解析器甚至不会查看字符串。在

运行以下代码失败:

值错误:不支持带编码声明的Unicode字符串。请使用不带 声明。

from lxml import etree

parser = etree.XMLParser(encoding='utf-8')

def convert_xml_to_utf8(xml_str):
    tree = etree.fromstring(xml_str, parser=parser)
    if tree.docinfo.encoding == 'utf-8':
        # already in correct encoding, abort
        return xml_str
    decoded_str = xml_str.decode(tree.docinfo.encoding)
    utf8_encoded_str = decoded_str.encode('utf-8')
    tree = etree.fromstring(utf8_encoded_str)
    tree.docinfo.encoding = 'utf-8'
    return etree.tostring(tree, pretty_print = True, xml_declaration = True, encoding='UTF-8', standalone="yes")


data = '''<?xml version='1.0' encoding='Windows-1255'?><rss version="2.0"><channel ><title ><![CDATA[ynet - חדשות]]></title></channel></rss>'''
print(convert_xml_to_utf8(data))

Tags: to字符串tree声明parserconvertwindowsxml
1条回答
网友
1楼 · 发布于 2024-09-28 05:25:12

data是unicode str。错误是说这样一个同时包含encoding="..."声明的东西是不受支持的,因为str应该已经从它的编码中解码了,因此它也包含一个编码声明是模棱两可/毫无意义的。它告诉你使用bytes来代替,例如data = b'<...>'。假设您应该以二进制模式打开一个文件,从那里读取数据,让etree处理encoding="...",而不是在代码中使用字符串文本,这会使编码情况更加复杂。在

简单到:

from xml.etree import ElementTree

#        open in binary mode ↓
with open('/tmp/test.xml', 'rb') as f:
    e = ElementTree.fromstring(f.read())

Et voilá,e包含已解析的文件,其编码已由etree根据文件的内部encoding="..."头正确解释。在

实际上,ElementTree有一个快捷方法:

^{pr2}$

相关问题 更多 >

    热门问题