Python抛出ascii编解码器can';解析xml时不进行编码

Python抛出ascii编解码器can';解析xml时不进行编码,python,xml,unicode,Python,Xml,Unicode,我用Python运行了以下代码: import xml.etree.ElementTree as ET tree = ET.parse('dplp_11.xml') root = tree.getroot() f = open('workfile', 'w') for country in root.findall('article'): rank = country.find('year').text name = country.find('title').text

我用Python运行了以下代码:

import xml.etree.ElementTree as ET
tree = ET.parse('dplp_11.xml')
root = tree.getroot()
f = open('workfile', 'w')
for country in root.findall('article'):
    rank = country.find('year').text
    name = country.find('title').text

    if(int(rank)>2009):
        f.write(name)
        auth = country.findall('author')
        for a in auth:
            #print str(a)
            f.write(a.text)
            f.write(',')
        f.write('\n')
我有一个错误:

Traceback (most recent call last):
  File "parser.py", line 14, in <module>
    f.write(a.text)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 4: ordinal not in range(128)
回溯(最近一次呼叫最后一次):
文件“parser.py”,第14行,在
f、 写(a.text)
UnicodeEncodeError:“ascii”编解码器无法对位置4中的字符u'\xe1'进行编码:序号不在范围内(128)
我试图解析dblp数据,如下所示:


桑吉夫·萨克塞纳
CRCW模型之间的并行整数排序和模拟。
607-619
1996
33
行动信息。
7.
db/journals/acta/acta33.html#Saxena96
http://dx.doi.org/10.1007/BF03036466
西蒙博扎帕利迪斯
佐尔坦·弗勒普0001
乔治·拉奥尼斯
等式加权树变换。
29-52
2012
49
行动信息。
1.
http://dx.doi.org/10.1007/s00236-011-0148-5
db/journals/acta/acta49.html#BozapalidisFR12

如何解决此问题?

a.text
是一个Unicode对象,但您正在尝试将其写入普通Python 2文件对象:

f.write(a.text)
f.write()
方法只接受一个字节字符串(type
str
),触发对ASCII编解码器的隐式编码,如果无法将文本编码为ASCII,则触发异常

您需要使用可以对数据进行编码的编解码器对其进行显式编码,或者使用为您进行编码的
io.open()
文件对象

明确编码到UTF-8将起作用,例如:

f.write(a.text.encode('utf8'))
或者使用带有显式编码的
io.open()

import io

# ...

f = io.open('workfile', 'w', encoding='utf8')
之后,对
f.write()
的所有调用必须是Unicode对象;在任何文本字符串前面加上
u

for a in auth:
    f.write(a.text)
    f.write(u',')
f.write(u'\n')

当我这样做的时候,我得到了另一个错误:“findall(article)语法错误:无效语法”@SAMAHA:您没有关闭前一行中的
括号。该错误已解决。但另一个错误是“f.write(name)write()参数1必须是unicode,而不是str”。我的python版本是2。7@SAMAHA:对,所有其他写入也必须是unicode;使用
u'、'
u'\n'
。我将进行更新。请注意,引发异常的是
f.write()
行。这里的问题不是XML解析,而是写入文本文件引起的问题
f.write(u'Zolt\xe1n')
会给出完全相同的错误。