scrapy 不会添加所有项目中都不存在的字段?
scrapy doesn't add fields which are not present in all items?
我从 link 中获取字段 a、b、c 并生成一个 OrderedDict。
但是,如果满足条件,我还没有让步,首先我对另一个 link 发出请求,将 a,b,c 字典传输到该请求(通过部分),并从中获取字段 d,e第二 link 并产生 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 是否不显示所有项目中不存在的字段?
注意:按字段我只是指列 header,我不使用 scrapy 的项目和字段 类,我只使用 OrderedDict
更新:我已经通过生成一个字典(更新第一个字典)设法解决了我的问题。不过我还是很好奇上面的问题
我们先快速浏览一下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 导出器必须仅从第一项推断出 headers。
如果您使用的是scrapy.Item
,应该完全没有问题。否则,如果您使用 Python 的 dict
,第一项的字段名将用作 CSV headers.
我从 link 中获取字段 a、b、c 并生成一个 OrderedDict。 但是,如果满足条件,我还没有让步,首先我对另一个 link 发出请求,将 a,b,c 字典传输到该请求(通过部分),并从中获取字段 d,e第二 link 并产生 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 是否不显示所有项目中不存在的字段?
注意:按字段我只是指列 header,我不使用 scrapy 的项目和字段 类,我只使用 OrderedDict
更新:我已经通过生成一个字典(更新第一个字典)设法解决了我的问题。不过我还是很好奇上面的问题
我们先快速浏览一下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 导出器必须仅从第一项推断出 headers。
如果您使用的是scrapy.Item
,应该完全没有问题。否则,如果您使用 Python 的 dict
,第一项的字段名将用作 CSV headers.