[英]python - How to properly encode string in utf8 which is ISO8859-1 from xml
我在python 2.7中使用以下代码来检索xmlFile,其中包含一些德国变音符,例如ä,ü,ö,ß:
.....
def getXML(self,url):
xmlFile=urllib2.urlopen(self.url)
xmlResponse=xmlFile.read()
xmlResponse=xmlResponse
xmlFile.close()
return xmlResponse
pass
def makeDict(self, xmlFile):
data = xmltodict.parse(xmlFile)
return data
def saveJSON(self, dictionary):
currentDayData=dictionary['speiseplan']['tag'][1]
file=open('data.json','w')
# Write the currentDay as JSON
file.write(json.dumps(currentDayData))
file.close()
return True
pass
# Execute
url="path/to/xml/"
App=GetMensaJSON(url)
xml=GetMensaJSON.getXML(App,url)
dictionary=GetMensaJSON.makeDict(App,xml)
GetMensaJSON.saveJSON(App,dictionary)
问题在于xml文件在其<xml>
标记中声称它是utf-8。 但是事实并非如此。 通过尝试,我发现它是iso8859_1,因此我想从utf-8转换为iso8859,然后再转换回utf-8来解决冲突。
是否有解决遗漏的变音符号的优雅方法? 例如,在我的代码中,我用ß \Ã\
代替ü \Ã\¼
我发现了类似的问题,但无法正常工作如何在Python中使用编码声明解析XML文件?
我还应该补充一点,我不能影响我获取xml的方式。
可以在代码中找到XML File Link。
“ repr(xmlResponse)”的输出为
"<?xml version='1.0' encoding='utf-8'?>\n<speiseplan>\n<tag timestamp='1453676400'>\n<item language='de'>\n<category>Stammessen</category>\n<title>Gem\xc3\x83\xc2\xbcsebr\xc3\x83\xc2\xbche mit Backerbsen (25,28,31,33,34), paniertes H\xc3\x83\xc2\xa4hnchenbrustschnitzel (25) mit Paprikasauce (33,34), Pommes frites und Gem\xc3\x83\xc2\xbcse
您正在尝试对已经编码的数据进行编码 。 urllib2.urlopen()
只能返回一个字节串,而不是unicode
,因此编码没有意义。
相反,发生的事情是Python在这里试图提供帮助。 如果您坚持对字节进行编码,那么它将首先对字节进行解码以对数据进行unicode
。 并且它将为此使用默认编解码器。
最重要的是,XML文档本身负责记录应使用哪种编解码器进行解码。 默认编解码器为UTF-8,请勿自行手动重新编码数据,而应将其留给XML解析器。
如果您的XML文档中有Mojibake数据 ,则解决此问题的最佳方法是在解析后进行修复。 我建议使用ftfy
软件包为您执行此操作。
您可以通过先解码为UTF-8,然后再次编码为Latin-1 来手动“修复”编码:
xmlResponse = xmlFile.read().decode('utf-8').encode('latin-1')
但是,这假设您的数据一开始就被错误地解码为Latin-1。 这并不总是一个安全的假设。 例如,如果将其解码为Windows CP 1252,则恢复数据的最佳方法是仍然使用ftfy
。
您可以在将XML解析为XML 之前尝试使用ftfy
,但这取决于文档未使用文本和属性内容之外的任何非ASCII元素:
xmlResponse = ftfy.fix_text(
xmlFile.read().decode('utf-8'),
fix_entities=False, uncurl_quotes=False, fix_latin_ligatures=False).encode('utf-8')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.