2011-08-04 188 views
12

Scrapyでは、items.pyにある特定の順序でアイテムを指定しました。&私のスパイダーは、同じ順序でこれらのアイテムを再度持ちます。しかし、スパイダー&を実行して結果をcsvとして保存すると、items.pyまたはspiderの列の順序は維持されません。特定の順序で列を表示するには、どうすればCSVを取得できますか。サンプルコードは非常に高く評価されます。Python Scrapy:CSVItemExporterに特定の順序で列を書き込む方法

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

答えて

18

これはModifiying CSV export in scrapy

に関連している問題は、輸出者が任意のキーワードをパラメータなしでインスタンス化されるということですので、EXPORT_FIELDSなどのキーワードは無視されます。解決策は同じです。キーワードパラメータを渡すには、CSVアイテムエクスポーターをサブクラス化する必要があります。

""" 
The standard CSVItemExporter class does not pass the kwargs through to the 
CSV writer, resulting in EXPORT_FIELDS and EXPORT_ENCODING being ignored 
(EXPORT_EMPTY is not used by CSV). 
""" 

from scrapy.conf import settings 
from scrapy.contrib.exporter import CsvItemExporter 

class CSVkwItemExporter(CsvItemExporter): 

    def __init__(self, *args, **kwargs): 
     kwargs['fields_to_export'] = settings.getlist('EXPORT_FIELDS') or None 
     kwargs['encoding'] = settings.get('EXPORT_ENCODING', 'utf-8') 

     super(CSVkwItemExporter, self).__init__(*args, **kwargs) 

、その後XYZZY/settings.pyにそれを追加しました:

は、上記レシピに続いて、私は新しいファイルXYZZY/feedexport.py(あなたscrapyクラスの名前は何に変更 "XYZZY")を作成しました:

FEED_EXPORTERS = { 
    'csv': 'xyzzy.feedexport.CSVkwItemExporter' 
} 

今CSVの輸出はEXPORT_FIELDの設定を尊重する - も/ settings.pyをXYZZYに追加:

# By specifying the fields to export, the CSV export honors the order 
# rather than using a random order. 
EXPORT_FIELDS = [ 
    'field1', 
    'field2', 
    'field3', 
] 
+3

で詳述するように、あなた自身のItemPipelineを作成する必要があります。この問題は、より最近のリリースでより簡単に解決されましたか? – not2qubit

+0

はい次の回答を参照してください – Toilal

5

は、私はあなたの質問をしたがScrapyは、今からCsvItemExporter継承BaseItemExporterクラスにfields_to_export属性を提供時間について知ることはできません。バージョン0.22を1として :

エクスポートされるフィールドの名前、またはNoneとfields_to_export

リストを使用すると、すべてのフィールドをエクスポートする場合。デフォルトはNoneです。

(CsvItemExporterのような)一部の輸出業者は、この属性で定義されたフィールドの順序 を尊重します。

もScrapyのウェブサイト上のBaseItemExporterCsvItemExporterのマニュアルを参照してください。この機能を使用するためには

は、しかし、私はこのポストはすでにかなり古いです参照this answer

+0

これは今すぐ最高の答えです!ありがとう – Toilal

関連する問題