我从链接获取字段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(更新第一个字典)来解决我的问题。但我仍然对上述问题感到好奇。
答案 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标题。