【问题标题】:scrapy doesn't add fields which are not present in all items?scrapy 不会添加所有项目中不存在的字段?
【发布时间】:2016-08-06 15:44:56
【问题描述】:

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

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

当我打印 OrderedDicts 时,它们是正确的:

第二个 OrderedDict 有键 d,e,a,b,c
第一个 OrderedDict 有键 a,b,c

但在导出的 .csv 文件中,我只看到 a、b、c 列。

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

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

更新:我已经设法通过产生一个字典(更新第一个字典)来解决我的问题。但是我还是对上面的问题很好奇。

【问题讨论】:

    标签: python scrapy field


    【解决方案1】:

    我们先快速浏览一下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 导出器必须仅从第一项推断标题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      相关资源
      最近更新 更多