关于如何在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))
data
是unicodestr
。错误是说这样一个同时包含encoding="..."
声明的东西是不受支持的,因为str
应该已经从它的编码中解码了,因此它也包含一个编码声明是模棱两可/毫无意义的。它告诉你使用bytes
来代替,例如data = b'<...>'
。假设您应该以二进制模式打开一个文件,从那里读取数据,让etree
处理encoding="..."
,而不是在代码中使用字符串文本,这会使编码情况更加复杂。在简单到:
Et voilá,
e
包含已解析的文件,其编码已由etree
根据文件的内部encoding="..."
头正确解释。在实际上,
^{pr2}$ElementTree
有一个快捷方法:相关问题 更多 >
编程相关推荐