2014-07-06 16 views
5

Ich kann einfach nicht herausfinden! :( Mir Verschrottung von Daten aus einem utf-8-codierten Ort, gut, dass zumindest ist das, was es sagt:python und scrapy DAS Kodierungsproblem

Content-Type: text/html;charset=utf-8 

Ich erhalte eine Liste der regelmäßigen Unicode-Strings mit XPath-Auswahl extract() Aufruf:

item['city']= element.select('//div[@id="bubble_2"]/div/text()').extract() 

Dies ist die Liste:

[u'Westbahnhofstr.\xa010', u'72070\xa0T\xfcbingen'] 

Jetzt werde ich Mitglied der Liste in eine Unicode-String:

item['city']= "".join(element.select('//div[@id="bubble_2"]/div/text()').extract()) 

So weit so gut:

u'Beim Nonnenhaus\xa0672070\xa0T\xfcbingen' 

Das Problem erscheint, während ich die Ausgabe dieses Unicode-String entweder auf Bildschirm (Druck) oder in eine Datei (schreiben) versuchen. was auch immer ich versuche, es gibt einen Fehler zurück (http://pastebin.com/51DkX2R2):

exceptions.UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 11: ordinal not in range(128) 

I Unicode-Byte-String codiert haben vor der Ausgabe natürlich:

item['city'].encode('utf-8') 

Das ist mein pipeline.py ist und wie ich zu öffnen und schreiben Sie an meine cvs:

import csv 
import items 
import urlparse 
import codecs 

class DepostPipeline(object): 
    def __init__(self): 
     self.modelsCsv = csv.writer(codecs.open('Dees.csv', mode='w',encoding='utf-8')) 
     self.modelsCsv.writerow(['city']) 

def process_item(self, item, spider): 
    if isinstance(item, items.DetailsItem): 
     item['city'] = item['city'].encode('utf-8') 

     self.modelsCsv.writerow([item['city']]) 
     return item 

Das seltsame ist, dass mein System (python auf Windows) Unicode-Strings perfekt Griffe:

C:\Console2>python 
Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> s=u'Beim Nonnenhaus\xa0672070\xa0T\xfcbingen' 
>>> print s 
Beim Nonnenhaus 672070 Tübingen 

Ich habe in den letzten 10 Tagen viel über utf-8, Unicode, Kodierung und Dekodierung gelesen, aber es scheint, dass ich hier noch etwas vermisse ?! Ich freue mich über jede Hilfe oder Beratung.

Antwort

7

Sie ignorieren das Ergebnis der .encode() Aufruf:

item['city'].encode('utf-8') 

Strings unveränderlich sind, und sind nicht an Ort und Stelle kodiert. Noch besser ist der Typ des zurückgegebenen Objekts ist anders.

item['city'] = item['city'].encode('utf-8') 

Allerdings sollten Sie nicht Verwendung codecs.open() für die CSV-Datei: Sie werden den Rückgabewert zurück zuweisen müssen. Das Modul csv schreibt immer Bytestrings, nicht Unicode.

Durch ein codecs.open() Datei-Objekt, ein impliziter dekodieren erfolgt in Unicode zurück zu bekommen, und es ist dass, die für Sie nicht; es ist, warum Sie eine UnicodeDecodeError Ausnahme erhalten, kein kodieren Fehler:

File "C:\Python27\lib\codecs.py", line 351, in write 
    data, consumed = self.encode(object, self.errors) 
exceptions.UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 11: ordinal not in range(128) 

Verwenden Sie einen regelmäßigen open() Aufruf statt:

self.modelsCsv = csv.writer(open('Dees.csv', mode='wb')) 

Notiere die 'wb'; Das Modul csv behandelt die Zeilenenden selbst.

+0

Sorry, irgendwie habe ich das von meinem Code verpasst haben, es schon an Ort und Stelle war ... Ich bin der Bearbeitung meiner Post. Danke für die Antwort. – mrki

+0

Komplettes Fehlerprotokoll: http://pastebin.com/51DkX2R2 – mrki

+0

@mrki: Recht, das ist, weil Sie 'codecs.open()' verwenden; Das habe ich vermisst. Für das nächste Mal wäre es sehr hilfreich, das Traceback in Ihrer Frage zu verwenden! :-) –