scrapy不会添加所有项目中都不存在的字段吗?

时间:2016-08-06 15:44:57

标签: 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

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

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

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

所以我的问题是:scrapy没有显示所有项目中都没有的字段吗?

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

更新:我设法通过产生一个dict(更新第一个字典)来解决我的问题。但我仍然对上述问题感到好奇。

1 个答案:

答案 0 :(得分:0)

让我们先快速了解scrapy.exporters.CsvItemExporter中的相关源代码:

elem

导出器本身处理流数据,这意味着它在写入文件之前无法缓冲所有蜘蛛输出。因此,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) ,则根本没有问题。否则,如果您使用的是Python scrapy.Item,则第一项的字段名将用作CSV标题。