基本上我有一個真正的默認設置,從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
是完全沒有意義的。
有人可以向我解釋嗎?
考慮到'dict's是Python中最優化的數據結構之一,或許一個更好的問題是:「Scrapy使用哪個數據結構*來存儲字段元數據?」 – bernie 2013-02-15 17:27:16
@bernie'Field'不被用作'dict'。所以'dict'作爲數據結構被優化並不重要。相反,'Item'用作'dict'來存儲任何分配給您以前定義爲'Field'的鍵的值。據我所知,「Item」很可能就是一個'namedtuple'。 – dAnjou 2013-02-16 19:48:33