2016-08-06 10 views
1

リンクからフィールドa、b、cを取得して、OrderedDictを生成します。 しかし条件が満たされていれば、私は別のリンクのリクエストを行い、そのリクエストにa、b、cの辞書を(部分的に)送信し、2番目のリンクからフィールドd、eを取得し、収量d、e、a、b、c。フィールドが C、E、A、Bを、D、およびいくつかの項目だけで、Bを持っている必要があり、治療はすべての項目に存在しない項目を追加しませんか?

cの私はOrderedDictsを印刷するとき、彼らは正しいが必要

だから、いくつかのアイテム:

the second OrderedDict has keys d,e,a,b,c 
the first OrderedDict has keys a,b,c

しかし、エクスポートされた.csvファイルでは、私はa、b、cの列しか見ることができません。

私の質問は次のとおりです:すべてのアイテムに存在しないフィールドを表示していませんか?

注:私はちょうど列ヘッダを意味するフィールドでは、私はscrapyの項目とフィールドのクラスを使用していない、私はちょうどOrderedDict

アップデートを使用します。私は、単一のdictをもたらすことにより、私の問題を解決するために管理してきました(更新します最初のdict)。しかし、私はまだ上記の質問に興味があります。

答えて

0

ましょう最初のscrapy.exporters.CsvItemExporterの関連ソースコードを簡単に見てい:

def export_item(self, item): 
     if self._headers_not_written: 
      self._headers_not_written = False 
      self._write_headers_and_set_fields_to_export(item) 

     fields = self._get_serialized_fields(item, default_value='', 
              include_empty=True) 
     values = list(self._build_row(x for _, x in fields)) 
     self.csv_writer.writerow(values) 

    def _write_headers_and_set_fields_to_export(self, item): 
     if self.include_headers_line: 
      if not self.fields_to_export: 
       if isinstance(item, dict): 
        # for dicts try using fields of the first item 
        self.fields_to_export = list(item.keys()) 
       else: 
        # use fields declared in Item 
        self.fields_to_export = list(item.fields.keys()) 
      row = list(self._build_row(self.fields_to_export)) 
      self.csv_writer.writerow(row) 

を輸出自体は、それがファイルに書き込む前すべてクモの出力をバッファリングすることはできませんを意味し、ストリーミングデータを扱います。従って、CSV輸出者は、第1項目のみからヘッダを推論しなければならない。

scrapy.Itemを使用している場合は、まったく問題ありません。それ以外の場合は、Pythonのdictを使用している場合は、最初の項目のフィールド名がCSVヘッダーとして使用されます。

+0

ありがとうございました@starrify –

関連する問題