python - 为什么 Scrapy 的字段是字典?

标签 python scrapy

基本上我有一个真正的默认设置,一个从 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 到底是什么时,我感到很困惑。这实际上是 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 是完全没有意义的。

有人能给我解释一下吗?

最佳答案

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

关于python - 为什么 Scrapy 的字段是字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14899815/

相关文章:

python - 计算复数相位/参数的不同函数

python - 获取数组某部分的平均值

python - 在子类中覆盖时使用父属性 setter

python - Xpath在scrapy 0.24.5中选择两个节点之间的节点

python - bvCase Insensitive Regex Replacement 来自字典

python - 如何根据 for 循环中给定列表的结果创建列表?

javascript - 无法使用 Python scrapy 和 Selenium 从 javascript 网页中选择元素

python - Scrapy 返回奇怪编码的字符串

python - Scrapy Scraper 不会抓取除比第一页更远的内容

python - 当脚本在根目录之外时获取 scrapy 项目设置