基本上我有一个真正的默认设置,从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