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。我想知道为什么会这样,并盯着实现看了一会儿。它仍然没有任何意义。所以我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

有人可以向我解释吗?

4

2 回答 2

8

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

于 2013-02-17T20:32:20.730 回答
3

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

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

于 2014-08-01T20:00:04.800 回答