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

时间:2013-02-15 17:10:56

标签: python scrapy

基本上我有一个非常默认的设置,一个从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实际上是什么时,我感到很困惑。这实际上是its implementation

 class Field(dict):
     """Container of field metadata"""

这很简单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'

什么?要么我做了一些完全错误的事情(我做了所有事情,比如官方教程和例子告诉我)或Fielddict完全没有意义。

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

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

字段 用作存储元数据的字典;一个用例是为ItemLoader指定输入和输出处理器。检查http://doc.scrapy.org/en/master/topics/loaders.html#declaring-input-and-output-processors

我个人认为Scrapy在没有任何元数据的情况下支持普通的dicts会很好,但这是另一个问题。