为什么Scrapy的场地是一个字母?

dAn*_*jou 4 python scrapy

基本上我有一个非常默认的设置,一个蜘蛛子类CrawlSpider和一个有三个字段的项目看起来像这样:

class AppdexItem(Item):
    name = Field()
    url = Field()
    desc = Field()
Run Code Online (Sandbox Code Playgroud)

当我的蜘蛛解析响应时,它会填充这样的项目:

i = AppdexItem()
name = hxs.select("//h1[@class='doc-banner-title']/text()")
i['name'] = name.extract()[0]
Run Code Online (Sandbox Code Playgroud)

当我读到Field实际上是什么时,我感到很困惑.这实际上是它的实现:

 class Field(dict):
     """Container of field metadata"""
Run Code Online (Sandbox Code Playgroud)

这很简单dict.我想知道为什么会这样,并盯着实施一段时间.它仍然没有任何意义.所以我跑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'
Run Code Online (Sandbox Code Playgroud)

什么?无论我在做什么完全错误的(我做的一切像官方教程和实例告诉我的)或者Field是一个dict完全没有意义的.

有人可以向我解释一下吗?

小智 8

历史原因.曾经存在附加到存储在字典中的字段的元数据.我假设使用了一个dict,因为它有一个方便的(key = value)构造函数.您可以看到此提交中删除了最后一次使用此操作.在这一点上,它几乎没有什么区别,它可能只是一个普通的对象(虽然如果还有代码那么改变可能很难,因为某些原因它假定它是一个字典).