【问题标题】:Scrapy: Item Loader and KeyError even when Key is definedScrapy:即使定义了 Key,也可以使用 Item Loader 和 KeyError
【发布时间】:2017-06-06 07:30:07
【问题描述】:

意图/预期行为

从页面返回链接的文本:https://www.bezrealitky.cz/vypis/nabidka-prodej/byt/praha

在 CSV 格式和 shell 中。

错误

我得到一个 KeyError: 'title',即使我已经在 item.py itemloader 中定义了键。

完整追溯

Traceback (most recent call last):
  File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\utils\defer.py", line 102, in iter_errback
    yield next(it)
  File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\spidermiddlewares\offsite.py", line 29, in process_spider_output
    for x in result:
  File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\spidermiddlewares\referer.py", line 22, in <genexpr>
    return (_set_referer(r) for r in result or ())
  File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\spidermiddlewares\urllength.py", line 37, in <genexpr>
    return (r for r in result or () if _filter(r))
  File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\spidermiddlewares\depth.py", line 58, in <genexpr>
    return (r for r in result or () if _filter(r))
  File "C:\Users\phili\Documents\Python Scripts\Scrapy Spiders\bezrealitky\bezrealitky\spiders\bezrealitky_spider.py", line 33, in parse
    yield loader.load_item()
  File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\loader\__init__.py", line 115, in load_item
    value = self.get_output_value(field_name)
  File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\loader\__init__.py", line 122, in get_output_value
    proc = self.get_output_processor(field_name)
  File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\loader\__init__.py", line 144, in get_output_processor
    self.default_output_processor)
  File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\loader\__init__.py", line 154, in _get_item_field_attr
    value = self.item.fields[field_name].get(key, default)
KeyError: 'title'

Spider.py

def 解析(自我,响应):

for records in response.xpath('//*[starts-with(@class,"record")]'):
    loader = BaseItemLoader(selector=records)
    loader.add_xpath('title', './/div[@class="details"]/h2/a[@href]/text()')
    yield loader.load_item()

Item.py - 项目加载器

class BaseItemLoader(ItemLoader):
    title_in = MapCompose(unidecode)

结论

我有点不知所措,因为我认为我遵循了 Scrapy 手册并通过“title_in”定义了项目加载器和密钥,但是当我为它产生值时,我得到了 KeyError。我在 shell 中检查 Xpath 提供了我想要的文本,所以至少这是有效的。希望得到一些帮助!

【问题讨论】:

    标签: python scrapy scrapy-spider


    【解决方案1】:

    即使您使用ItemLoader,您也应该先定义Item 类,然后将其传递给项目加载器,或者将其定义为加载器的属性:

    class CustomItemLoader(ItemLoader):
        default_item_class = MyItem
    

    或将其实例传递给加载器的构造函数:

    l = CustomItemLoader(item=Item())
    

    否则项目加载器对项目及其字段一无所知。

    【讨论】:

    • 非常感谢 mizhgun,它成功了!我必须在 items.py 中有一个单独的类来定义实际的项目,然后是一个单独的类,它是实际的 itemloader。都点击了你的提示,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-09-29
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2021-02-22
    相关资源
    最近更新 更多