2012-03-27 73 views
0

我知道每個人都厭倦了編碼問題,但我無法弄清楚這一點。Python搞砸了斯堪的納維亞字符(Ö - >Ã)

我從Python中的XML文件(API)獲取數據。一切都很好,但是當我打印包含斯堪的納維亞的字符,如ÖÄ價值觀,他們搞的一團糟:

Ö -> Ã 
Ä -> ä 

的XML文檔是UTF-8編碼。

這是我的代碼。抱歉給你帶來不便。

# Get the data 
from urllib2 import urlopen 
ur = urlopen("http://www.leffatykki.com/xml/leffat") 
data = ur.read() 

# Replace ampersands (triggers an error) 
data = data.replace('&', '&') 

# Loop XML 
from lxml import etree 
from cStringIO import StringIO 

def fast_iter(context, func): 
    for event, elem in context: 
     func(elem) 
     elem.clear() 
     while elem.getprevious() is not None: 
      del elem.getparent()[0] 
    del context 

def process_element(elem): 
    try: 
     name = elem.xpath('name/text()')[0] 
     year = elem.xpath('year/text()')[0] 
     print name 
    except IndexError: 
     temp = '...' 

context = etree.iterparse(StringIO(data), tag='movie') 
fast_iter(context, process_element) 
+1

哦,但從結果的外觀來看,只需打印出UTF-8的字節表示即可。 – schlenk 2012-03-27 19:14:17

+0

「許多」是有點滑稽。 stdlib有一些衆所周知的問題,有些人知道如何使用外部軟件包。 – 2012-03-27 19:16:14

+0

我已經添加了我的完整代碼,謝謝你們的幫助。 – 2012-03-27 19:27:43

回答

0

在您的來電 「etree.iterparse」,嘗試填寫編碼值:

context = etree.iterparse(StringIO(data), tag='movie', encoding="utf-8") 

從itree.iterparse文檔: 「」」 |其他關鍵字參數: | - 編碼:覆蓋文檔編碼 | - 模式:一個XMLSchema來驗證針對 「」「

更好但忘記:

我已經下載了你的文件並進行了遊戲 - 它似乎在工作,至少對於第一部電影 - 也許你已經在文件本身中嚴重編碼了字符?這是要麼taht或一切都很好,而只是在你的打印聲明 - 嘗試使用「print name.encode("utf-8")」 - 或終端的正確編碼,而不是讓python試圖猜測它。

+0

我其實早些時候嘗試過這兩種,但輸出是相同的。 – 2012-03-28 10:01:11

+0

找到您的終端的正確編碼 - 它最喜歡的不是utf-8。例如,如果您使用Windows,則它傾向於使用以古代編碼作爲外殼的傳統DOS終端。對於Latin-1字符集,儘管世界標準是utf-8,但所有Windows本機代碼都使用「cp1252」編碼,但運行Python程序的DOS終端使用「cp850」 - 即使與Windows本身使用的編碼器不兼容。發生了什麼是Python找不到你的終端的默認編碼。或者只是將輸出寫入文件,然後在編輯器中打開它,而不是打印。 – jsbueno 2012-03-29 12:51:05

相關問題