为什么Scrapy中的Field是一个字典?

4

基本上,我有一个非常基础的设置,一个从CrawlSpider继承的蜘蛛子类和一个包含三个字段的项目,看起来像这样:

class AppdexItem(Item):
    name = Field()
    url = Field()
    desc = Field()

当我的爬虫解析响应时,它会填充一个类似于这样的项目:
i = AppdexItem()
name = hxs.select("//h1[@class='doc-banner-title']/text()")
i['name'] = name.extract()[0]

现在当我阅读Field的实际含义时,我感到困惑。这就是它的实现代码: (链接)
 class Field(dict):
     """Container of field metadata"""

这是一个简单的 dict。我想知道为什么会这样,并且盯着实现看了一会儿。但还是不太明白。所以我在一个应该解析成item的页面上运行了 scrapy shell,这就是我得到的结果:

In [16]: item = spider.parse_app(response)

In [17]: item.fields
Out[17]: {'desc': {}, 'name': {}, 'url': {}}

In [18]: item['name']
Out[18]: u'Die Kleine Meerjungfrau'

什么?我可能做错了什么(我按照官方教程和示例做了一切),或者Field作为一个dict是完全没有意义的。
有人能解释一下吗?

2
考虑到 dict 是 Python 中最优化的数据结构之一,也许更好的问题是:“Scrapy 应该使用哪种数据结构来存储字段元数据?” - mechanical_meat
@bernie 这里的Field并不是作为字典(dict)来使用。所以即使字典这种数据结构已经被优化,也与它无关。相反,Item被用作字典(dict)来存储赋给Field定义的任何键(key)的任何值(value)。就我所看到的来说,Item很可能只是一个namedtuple - dAnjou
2个回答

8

历史原因。字段曾附加存储在dict中的元数据。我认为dict被使用是因为它有方便的(key=value)构造函数。你可以看到,最后一次使用的情况被删除在这个提交中。现在已经没有什么区别,它可以只是一个简单的对象(尽管更改可能很困难,如果还有代码假定它是dict,因为某些原因)。


3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接