如何初始化 Field() 以包含嵌套的 python 字典?
How can I initialize a Field() to contain a nested python dict?
我的 items.py 中有一个 Field() 名为:
scores = Field()
我想要多个抓取器将一个值附加到分数内的嵌套字典。比如我的一个爬虫:
item['scores']['baseball_score'] = '92'
另一个爬虫会:
item['scores']['basket_score'] = '21'
这样当我检索分数时:
> item['scores']
{ 'baseball_score': '92', 'basket_score': '21' }
我不想在我的抓取器中初始化字典,因为我所有的抓取器都会同时 运行ning,所以可能会出现竞争问题。无论如何,我是否可以将 item['scores'] 初始化为 items.py 中的嵌套字典?或者,我应该在 运行 我的爬虫初始化之前创建一个脚本吗?
我实际上想将我的项目中的所有字段设为嵌套列表或字典。一旦我的爬虫完成,我计划以某种方式将它们汇总到我的 pipelines.py.
这让我开始思考是否应该为我的每个爬虫设置不同的项目 Class,然后在所有爬虫完成后将它们聚合为 1 个项目。想法?
可使用defaultdict
实现
from collections import defaultdict
item = defaultdict(dict)
然后你可以将项目传递给所有的抓取工具,他们每个人都可以在适当的键上添加数据。请注意,上面仅创建了一个 2 级字典。
用 Perl 风格做这样多层次的事情的最好方法 autovivification。
Python中有多种实现自动生成的方法,涉及defaultdict
的递归定义或子类化dict
这里是涉及__getitem__
的子类:
class AutoVivification(dict):
"""Implementation of perl's autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
>>> item=AutoVivification()
>>> item['scores']['baseball_score'] = '92'
>>> item
{'scores': {'baseball_score': '92'}}
这是另一种方法,涉及 __missing__
:
class Autoviv(dict):
def __missing__(self, key):
value = self[key] = type(self)()
return value
>>> common_name = Autoviv()
>>> common_name['Mammalia']['Primates']['Homo']['H. sapiens'] = 'human being'
>>> common_name
{'Mammalia': {'Primates': {'Homo': {'H. sapiens': 'human being'}}}}
这两种方法都适用于任意深度的嵌套。
我的 items.py 中有一个 Field() 名为:
scores = Field()
我想要多个抓取器将一个值附加到分数内的嵌套字典。比如我的一个爬虫:
item['scores']['baseball_score'] = '92'
另一个爬虫会:
item['scores']['basket_score'] = '21'
这样当我检索分数时:
> item['scores']
{ 'baseball_score': '92', 'basket_score': '21' }
我不想在我的抓取器中初始化字典,因为我所有的抓取器都会同时 运行ning,所以可能会出现竞争问题。无论如何,我是否可以将 item['scores'] 初始化为 items.py 中的嵌套字典?或者,我应该在 运行 我的爬虫初始化之前创建一个脚本吗?
我实际上想将我的项目中的所有字段设为嵌套列表或字典。一旦我的爬虫完成,我计划以某种方式将它们汇总到我的 pipelines.py.
这让我开始思考是否应该为我的每个爬虫设置不同的项目 Class,然后在所有爬虫完成后将它们聚合为 1 个项目。想法?
可使用defaultdict
实现from collections import defaultdict
item = defaultdict(dict)
然后你可以将项目传递给所有的抓取工具,他们每个人都可以在适当的键上添加数据。请注意,上面仅创建了一个 2 级字典。
用 Perl 风格做这样多层次的事情的最好方法 autovivification。
Python中有多种实现自动生成的方法,涉及defaultdict
的递归定义或子类化dict
这里是涉及__getitem__
的子类:
class AutoVivification(dict):
"""Implementation of perl's autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
>>> item=AutoVivification()
>>> item['scores']['baseball_score'] = '92'
>>> item
{'scores': {'baseball_score': '92'}}
这是另一种方法,涉及 __missing__
:
class Autoviv(dict):
def __missing__(self, key):
value = self[key] = type(self)()
return value
>>> common_name = Autoviv()
>>> common_name['Mammalia']['Primates']['Homo']['H. sapiens'] = 'human being'
>>> common_name
{'Mammalia': {'Primates': {'Homo': {'H. sapiens': 'human being'}}}}
这两种方法都适用于任意深度的嵌套。