2013-02-15 94 views
3

基本上我有一个真正的默认设置,从CrawlSpider子类蜘蛛,有三个领域寻找这样一个项目:为什么Scrapy的字段是字典?

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是完全没有意义的。

有人可以向我解释吗?

+2

考虑到'dict's是Python中最优化的数据结构之一,或许一个更好的问题是:“Scrapy使用哪个数据结构*来存储字段元数据?” – bernie 2013-02-15 17:27:16

+0

@bernie'Field'不被用作'dict'。所以'dict'作为数据结构被优化并不重要。相反,'Item'用作'dict'来存储任何分配给您以前定义为'Field'的键的值。据我所知,“Item”很可能就是一个'namedtuple'。 – dAnjou 2013-02-16 19:48:33

回答

6

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