2011-06-27 13 views
1

現在、私のスパイダーは必要に応じて結果をフェッチしますが、ユニコードでエンコードします(UTF-8、私は信じています)。これらの結果をCSVに保存すると、その結果、Scrapyが挿入するすべての文字が含まれています。Scrapy Python spider:ユニコードではなくLatin-1で結果を保存

どのように正確に結果をラテン文字として格納するのですか?&ユニコードではありません。どこに変更を加える必要がありますか?

ありがとうございました。 -TM

+1

問題はユニコードではありません。オープンするために使用しているプログラムは何でも、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'> 

EDIT: 例外は、試しにこれをラップし、item_extracted型ユニコードである

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

文字列にASCII以外の文字が含まれている場合、 UnicodeEncodeErrorが発生します。 –

+0

編集時に処理されます。ありがとう@buffer。 –

4

除くのは良い考えかもしれません発生する可能性があることを知って。それは(parse関数で)またはitem pipelineまたはoutput processor

最も簡単な方法は、あなたのparse関数

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

私はアイテムのパイプラインでこれを持つことが理にかなっていると思います。あなたのコードがどこに行くべきか正確にはわかりません。クラスMyPipeline(オブジェクト)::私の現在のアイテムのパイプラインはこのように書き デフprocess_item(自己、アイテム、クモ): リターン項目 – user818190

+0

user818190 @エディタ答え – Medorator

+0

は(unicode_to_str行いませ参照)の引数が必要ですか?私は少なくとも1つの議論が必要であると言っている間違いを得ています。私はunicode_to_str( 'latin-1'、 'ignore')を試しましたが、運がないので、私は[u 'でラップされたデータを取得し続けます。何か不足していますか? – user818190

関連する問題