[英]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.