2014-07-06 9 views
5

मैं सरल नहीं समझ सकता! :( मैं एक utf-8 इनकोडिंग साइट से डेटा को खत्म कर रहा हूँ, अच्छी तरह से है कि कम से कम है कि यह क्या कहते हैं:पायथन और स्केपर एन्कोडिंग समस्या

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

मैं एक() कॉल XPath चयनकर्ता निकालने के साथ नियमित रूप यूनिकोड तार की सूची हो रही है:

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

अब मैं एक यूनिकोड स्ट्रिंग में सूची में शामिल हो:

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

इस सूची में है 210

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

अब तक तो अच्छा:

u'Beim Nonnenhaus\xa0672070\xa0T\xfcbingen' 

समस्या दिखाई देता है, जबकि मैं उत्पादन करने के लिए इस यूनिकोड स्ट्रिंग स्क्रीन पर या तो (प्रिंट) या एक फ़ाइल (लिख) की कोशिश करो। जो कुछ भी मैं इसे एक त्रुटि (http://pastebin.com/51DkX2R2) रिटर्न का प्रयास करें:

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

यह मेरा pipeline.py है और कैसे मैं खोलने के लिए उपयोग और:

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

मैं निश्चित रूप से उत्पादन से पहले बाइट स्ट्रिंग के लिए यूनिकोड इनकोडिंग है मेरी सीवीएस पर लिखें:

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 

सबसे अजीब बात यह है कि अपने सिस्टम (खिड़कियों पर अजगर) संभालती पूरी तरह से यूनिकोड तार है

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 

मैं पिछले 10 दिनों में यूटीएफ -8, यूनिकोड, एन्कोडिंग और डिकोडिंग के बारे में पढ़ रहा हूं लेकिन ऐसा लगता है कि मुझे अभी भी कुछ याद आ रहा है ?! मैं किसी भी मदद या सलाह की सराहना करता हूं।

उत्तर

7

आप .encode() कॉल का परिणाम अनदेखी कर रहे हैं:

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

स्ट्रिंग्स अपरिवर्तनीय हैं, और यथा-स्थान इनकोडिंग नहीं कर रहे हैं। इससे भी बेहतर, लौटा ऑब्जेक्ट का प्रकार अलग है। आप वापसी मान वापस निर्दिष्ट करना होगा:

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

लेकिन, आप चाहिए नहीं CSV फ़ाइल के लिए उपयोग codecs.open()csv मॉड्यूल हमेशा यूनिकोड नहीं, बल्कि अलमारी लिखेंगे।

एक codecs.open() फ़ाइल वस्तु का उपयोग करके, एक अंतर्निहित डिकोड यूनिकोड को वापस पाने के लिए जगह लेता है, और यह कि है कि आप के लिए विफल रहता है है,

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) 

उपयोग एक नियमित open() बजाय कॉल: यह कारण है कि आप एक UnicodeDecodeError अपवाद मिलता है, नहीं एक एनकोड त्रुटि है

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

नोट 'wb'; csv मॉड्यूल लाइन अंतराल को ही संभालता है।

+0

क्षमा करें, किसी भी तरह मैं याद है कि मेरे कोड से, यह जगह पर पहले से ही था ... मैं अपने पोस्ट को संपादित करने कर रहा हूँ। जवाब के लिए धन्यवाद। – mrki

+0

पूर्ण त्रुटि लॉग: http://pastebin.com/51DkX2R2 – mrki

+0

@mrki: ठीक है, ऐसा इसलिए है क्योंकि आप 'codecs.open()' का उपयोग कर रहे हैं; मैंने यह खो दिया। अगली बार, आपके प्रश्न में ट्रेसबैक सहित बहुत उपयोगी होगा! :-) –

-1

आप "उपेक्षा" पैरामीटर का उपयोग कर सकते हैं:

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

https://docs.python.org/2/howto/unicode.html#the-unicode-type

+0

यूटीएफ -8 * सभी * यूनिकोड कोडपॉइंट्स को संभाल सकता है; यहां * अनदेखा करने के लिए कुछ भी नहीं है। –

संबंधित मुद्दे