Scrapy 刮皮不';是否添加并非所有项目中都存在的字段?

Scrapy 刮皮不';是否添加并非所有项目中都存在的字段?,scrapy,field,ignore,Scrapy,Field,Ignore,我从链接中获取字段a、b、c,并生成一个OrderedDict。 但是如果一个条件得到满足,我还没有屈服,首先我请求另一个链接,将a,b,c字典传输到该请求(通过部分),并从第二个链接获取字段d,e,并屈服于d,e,a,b,c 所以有些项目应该有d,e,a,b,c字段 有些项目应该只有a,b,c 当我打印订购的图片时,它们是正确的: the second OrderedDict has keys d,e,a,b,c the first OrderedDict has keys a,b,c 第二个

我从链接中获取字段a、b、c,并生成一个OrderedDict。 但是如果一个条件得到满足,我还没有屈服,首先我请求另一个链接,将a,b,c字典传输到该请求(通过部分),并从第二个链接获取字段d,e,并屈服于d,e,a,b,c

所以有些项目应该有d,e,a,b,c字段 有些项目应该只有a,b,c

当我打印订购的图片时,它们是正确的:

the second OrderedDict has keys d,e,a,b,c the first OrderedDict has keys a,b,c 第二个订单的DICT有键d、e、a、b、c 第一个订单的ICT有a、b、c键 但在导出的.csv文件中,我只看到a、b、c列

所以我的问题是:scrapy是否没有显示所有项目中都不存在的字段

注意:字段我只是指列标题,我不使用scrapy的Item和Fields类,我只使用OrderedDict


更新:我通过生成一个dict(更新第一个dict)解决了我的问题。但我仍然对上面的问题感到好奇。

让我们首先快速查看一下以下中的相关源代码:

导出器本身处理流数据,这意味着它不能在写入文件之前缓冲所有spider输出。因此,CSV导出器必须仅从第一项推断标题


如果您使用的是
scrapy.Item
,应该没有任何问题。否则,如果您使用的是Python的dict,则第一项的字段名将用作CSV头。

让我们首先快速查看以下内容中的相关源代码:

导出器本身处理流数据,这意味着它不能在写入文件之前缓冲所有spider输出。因此,CSV导出器必须仅从第一项推断标题

如果您使用的是
scrapy.Item
,应该没有任何问题。否则,如果使用Python的
dict
,则第一项的字段名将用作CSV头

    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)