我有一些XML文件,我想用脚本处理它们,将它们从它们所处的任何编码转换为UTF-8。
使用this great answer中给出的代码我可以进行转换,但是如何读取XML头中给出的编码?
例如,我有许多已经使用UTF-8的文件,应该单独使用:
<?xml version="1.0" encoding="utf-8"?>
但是,我有很多做需要转换的文件:
<?xml version="1.0" encoding="windows-1255"?>
如何在Python中检测这些文件的标头中指定的XML编码?更好的是,在我检测并重新编码文件后,如何将此XML标题更改为“utf-8”以避免将来处理它?</ p>
答案 0 :(得分:5)
使用lxml
进行解析;然后,您可以使用以下命令访问原始编码:
from lxml import etree
with open(filename, 'r') as xmlfile:
tree = etree.parse(xmlfile)
if tree.docinfo.encoding == 'utf-8':
# already in correct encoding, abort
return
然后,您可以使用lxml
以UTF-8再次写出文件。
答案 1 :(得分:1)
如何检测这些标头中指定的XML编码 Python中的文件?
Rob Wolfe的solution仅使用标准库:
from xml.parsers import expat
s = """<?xml version='1.0' encoding='iso-8859-1'?>
<book>
<title>Title</title>
<chapter>Chapter 1</chapter>
</book>"""
class MyParser(object):
def XmlDecl(self, version, encoding, standalone):
print "XmlDecl", version, encoding, standalone
def Parse(self, data):
Parser = expat.ParserCreate()
Parser.XmlDeclHandler = self.XmlDecl
Parser.Parse(data, 1)
parser = MyParser()
parser.Parse(s)
答案 2 :(得分:0)
我想扩展@PiotrDobrogost的答案,并实际编写一个检索XML文档编码的类:
from xml.parsers import expat
class XmlParser(object):
'''class used to retrive xml documents encoding
'''
def get_encoding(self, xml):
self.__parse(xml)
return self.encoding
def __xml_decl_handler(self, version, encoding, standalone):
self.encoding = encoding
def __parse(self, xml):
parser = expat.ParserCreate()
parser.XmlDeclHandler = self.__xml_decl_handler
parser.Parse(xml)
这是其用法示例:
xml = """<?xml version='1.0' encoding='iso-8859-1'?>
<book>
<title>Title</title>
<chapter>Chapter 1</chapter>
</book>"""
parser = XmlParser()
encoding = parser.get_encoding(xml)