基本上,我有一个非常基础的设置,一个从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的实际含义时,我感到困惑。这就是它的实现代码: (链接)
class Field(dict):
"""Container of field metadata"""
这是一个简单的 dict
。我想知道为什么会这样,并且盯着实现看了一会儿。但还是不太明白。所以我在一个应该解析成item的页面上运行了 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
是 Python 中最优化的数据结构之一,也许更好的问题是:“Scrapy 应该使用哪种数据结构来存储字段元数据?” - mechanical_meatField
并不是作为字典(dict)来使用。所以即使字典这种数据结构已经被优化,也与它无关。相反,Item
被用作字典(dict)来存储赋给Field
定义的任何键(key)的任何值(value)。就我所看到的来说,Item
很可能只是一个namedtuple
。 - dAnjou