2013-02-15 55 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中刪除了最後一次使用。在這一點上,它幾乎沒有什麼區別,它可能只是一個普通的對象(儘管如果仍然有代碼出於某種原因認爲它是字典,那麼更改可能會很困難)。