2011-06-27 33 views
1

目前我的spider根據需要獲取結果,但是以unicode編碼(UTF-8,我相信)。當我將這些結果保存到csv時,我需要做大量的清理工作,其中包含Scrapy插入的所有其他字符。Scrapy Python spider:以拉丁-1而不是unicode存儲結果

如何將結果存儲爲拉丁字符,&不是unicode。我需要做哪些改變?

謝謝。 -TM

+1

你的問題不是unicode,而是你用來打開它的任何程序都期望latin-1。當您打開它以使用UTF-8作爲字符編碼時,它應該有一個選項。 –

+0

您也可以使用scrapy.utils.python中的unicode_to_str函數,將編碼設置爲'latin-1',將錯誤設置爲'ignore' – Medorator

+0

如果問題解決了,則Plz接受答案 – Medorator

回答

1

如果您的問題與您所說的相同,則解決方案與投射到字符串一樣簡單。

>>> a = u'spam and eggs' 
>>> a 
u'spam and eggs' 
>>> type(a) 
<type 'unicode'> 
>>> b = str(a) 
>>> b 
'spam and eggs' 
>>> type(b) 
<type 'str'> 

編輯: 明知異常可能發生,可能是在嘗試把這個包以及除

try: 
    str(a) 
except UnicodeError: 
    print "Skipping string %s" % a 
+0

如果字符串包含非ASCII字符,這會引發'UnicodeEncodeError'。 –

+0

在編輯中解決。 –

4

的item_extracted的類型是Unicode的一個好主意。其中,它的提取(在解析功能),或在item pipelineoutput processor

最簡單的辦法就是這一行添加到您的解析函數

item_to_be_stored = item_extracted.encode('latin-1','ignore') 

或者你可以定義一個函數,可以將其編碼爲拉丁文在您的項目類中。

from scrapy.utils.python import unicode_to_str 

def u_to_str(text): 
    unicode_to_str(text,'latin-1','ignore') 

class YourItem(Item): 
    name = Field(output_processor=u_to_str()) 
+0

謝謝@buffer。我覺得在項目管道中有這個意義。不確定你的代碼應該在哪裏。我目前的項目管道如下所示:class MyPipeline(object): def process_item(self,item,spider): return item – user818190

+0

@ user818190請參閱編輯器答案 – Medorator

+0

unicode_to_str()是否需要參數?我得到錯誤說至少需要1個參數;我試過unicode_to_str('latin-1','ignore'),但沒有運氣,我繼續把數據包裝在[u'中。我錯過了什麼嗎? – user818190