2014-07-06 24 views
5

Kolayca anlayamıyorum!python and scrapy THE kodlama sorunu

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

Ben XPath seçici ekstresi ile düzenli unicode dizeleri listesini() çağrısı alıyorum:

:(Ben de o ne diyor en azından bir utf-8 kodlu sitesinden veri hurdaya am

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

Şimdi ben unicode dizeye listesine katılın:

Bu listesidir 210

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

Şimdiye kadar iyi: Ben çıkışına bu unicode dize ya ekrana (baskı) veya dosyaya (yazma) çalışırken

u'Beim Nonnenhaus\xa0672070\xa0T\xfcbingen' 

sorun görünür. neyse ben bir hata (http://pastebin.com/51DkX2R2) döndürür deneyin: Bu benim pipeline.py olduğunu

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

ve nasıl açmak için kullanmak ve: Tabii çıktı önce bayt dizeye unicode kodlanmış olan

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

benim cvs yazabilirsiniz:

012:

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 

en garip şey benim sistem (pencerelerde piton) kusursuzca unicode dizeleri kolları olmasıdır

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 

Son 10 günde utf-8, unicode, kodlama ve kod çözme hakkında çok şey okudum ama hala burada bir şey özlüyorum gibi görünüyor ?! Herhangi bir yardım veya tavsiyeye minnettarım.

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

Karakter dizileri değişmez ve yerinde kodlanmamış:

cevap

7

Sen .encode() çağrısının sonucunu görmezden. Daha da iyisi, iade edilen nesnenin tipi farklıdır. Geri dönüş değeri atamak gerekir:

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

Ancak, gerektiği değil CSV dosyası için kullanılması codecs.open(). csv modülü her zaman Unicode değil, test dizileriyle yazılacaktır.Bir codecs.open() dosya nesnesini kullanarak

, örtük bir çözmek Unicode geri almak için gerçekleşir, ve sizin için başarısız olduğunu olduğu;

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) 

Kullanım yerine normal open() çağrı: Eğer bir UnicodeDecodeError istisna olsun neden değil, bir kodlama hatası olduğunu

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

Not 'wb'; csv modülü, hat sonlarını kendisi ele alır.

+0

Üzgünüm, nedense benim kodundan, yerine zaten olduğunu cevapsız ... Ben yazıyı düzenliyor duyuyorum. Yanıt verdiğiniz için teşekkürler. – mrki

+0

Komple Hata günlüğü: http://pastebin.com/51DkX2R2 – mrki

+0

@mrki: doğru, çünkü 'codecs.open()'; Onu özledim. Bir dahaki sefere, sorunuzdaki traceback de dahil olmak üzere, çok yararlı olacaktır! :-) –