2016-07-03 7 views
0

Ich wurde in Python den folgenden Code ausführen:Python wirft ascii-Codec kann nicht codieren, wenn das Parsen von XML

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') 

Ich habe einen Fehler:

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) 

Ich habe versucht, die Daten zu analysieren DBLP Das sieht so aus:

<?xml version="1.0"?> 
<dblp> 
<article mdate="2011-01-11" key="journals/acta/Saxena96"> 
<author>Sanjeev Saxena</author> 
<title>Parallel Integer Sorting and Simulation Amongst CRCW Models.</title> 
<pages>607-619</pages> 
<year>1996</year> 
<volume>33</volume> 
<journal>Acta Inf.</journal> 
<number>7</number> 
<url>db/journals/acta/acta33.html#Saxena96</url> 
<ee>http://dx.doi.org/10.1007/BF03036466</ee> 
</article> 
<article mdate="2015-07-14" key="journals/acta/BozapalidisFR12"> 
<author>Symeon Bozapalidis</author> 
<author>Zoltán Fülöp 0001</author> 
<author>George Rahonis</author> 
<title>Equational weighted tree transformations.</title> 
<pages>29-52</pages> 
<year>2012</year> 
<volume>49</volume> 
<journal>Acta Inf.</journal> 
<number>1</number> 
<ee>http://dx.doi.org/10.1007/s00236-011-0148-5</ee> 
<url>db/journals/acta/acta49.html#BozapalidisFR12</url> 
</article> 
</dblp> 

Wie kann ich es lösen?

+0

Beachten Sie, dass es das 'f.write()' Linie ist, die die Ausnahme auslöst. Es ist nicht das * XML-Parsing *, das hier auftritt, sondern das Schreiben in die Textdatei, die das Problem verursacht. 'f.write (u'Zolt \ xe1n ')' würde Ihnen genau den gleichen Fehler geben. –

Antwort

1

a.text ist ein Unicode-Objekt, aber Sie versuchen, es zu einem Objekt Ebene Python 2 Datei zu schreiben:

f.write(a.text) 

Die f.write() Methode dauert nur eine Byte string (Typ str), Auslösen eines impliziten Kodieren Sie in den ASCII-Codec und lösen Sie Ihre Ausnahme aus, wenn der Text nicht als ASCII kodiert werden kann.

Sie müssen es entweder explizit mit einem Codec codieren, der Ihre Daten codieren kann, oder ein io.open() Dateiobjekt verwenden, das die Codierung für Sie übernimmt.

Encoding explizit auf UTF-8 funktionieren würde, zum Beispiel:

f.write(a.text.encode('utf8')) 

oder io.open() mit einer expliziten Kodierung verwenden:

import io 

# ... 

f = io.open('workfile', 'w', encoding='utf8') 

wonach alle Anrufe f.write() Unicode-Objekte sein müssen ; Präfix alle Literalzeichenfolgen mit u:

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

Als ich das tat, bekam ich einen weiteren Fehler, der sagte "für Land in findall (Artikel) Syntaxfehler: ungültige Syntax" – SAMAHA

+0

@SAMAHA: Sie schlossen die ')' Klammern in einer vorhergehenden Zeile dann nicht. –

+0

: Dieser Fehler ist gelöst. Aber ein anderer Fehler sagte "f.write (name) write() Argument 1 muss unicode, nicht str sein" – SAMAHA