基本上我有一个非常默认的设置,一个从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'
什么?要么我做了一些完全错误的事情(我做了所有事情,比如官方教程和例子告诉我)或Field
是dict
完全没有意义。
有人可以向我解释一下吗?
答案 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会很好,但这是另一个问题。