2012-03-27 54 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