【问题标题】:KeyError: image_link key not found in Scrapy but present in items.pyKeyError:在 Scrapy 中找不到 image_link 键,但在 items.py 中存在
【发布时间】:2015-08-27 03:20:15
【问题描述】:

我的 items.py 看起来像:

import scrapy

class NewsItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    pubDate = scrapy.Field()
    description = scrapy.Field()
    image_link = scrapy.Field()
    pass

还用了一个蜘蛛

class Spider(BaseSpider):
    NO_IMAGE = "NoImageFound"
    name = '****'
    allowed_domains = ['****', '****']
    start_urls = [
        'http://*****',
    ]

    def parse(self, response):
        self.log('A response from %s just arrived!' % response.url)
        sel = Selector(response)
        _items = sel.xpath('//item')
        for item in _items:
            _item = NewsItem()
            _title = item.xpath('title/text()').extract()
            _item['title'] = ""
            if _title:
                _item['title'] = _title[0]

            #other stuffs here

            yield Request(_item['link'], callback=self.parse_detail, meta={'_item': _item})
            yield _item


    def parse_detail(self, response):
        _item = response.meta.get('_item')
        sel = Selector(response)
        try:
            _item['image_link'] = sel.select("//div[@class='article_content']/*/img/@src").extract()[0]
        except:
            try:
                _item['image_link'] = sel.select("//div[@class='entry']/descendant::node()/img/@src").extract()[0]
            except:
                _item['image_link'] = self.NO_IMAGE
        if _item['image_link'][0].endswith('gif'):
            _item = self.NO_IMAGE
        # _item['image_link'] = "TESTING"
        return _item

pipelines.py

class NewsUploadPipeline(object):
    def process_item(self, item, spider):
        title = item['title'].encode('ascii', 'ignore')
        description = item['description'].encode('ascii', 'ignore')
        link = item['link'].encode('ascii', 'ignore')
        image_link = item['image_link'].encode('ascii', 'ignore')

当我运行项目时,我得到了这个:

File "/home/khadka/rkbnb/my_app/crawler/rkbnbcrawler/rkbnbcrawler/pipelines.py", line 16, in process_item
    image_link = item['image_link'].encode('ascii', 'ignore')
  File "/home/khadka/rkbnb/my_app/lib/python2.7/site-packages/scrapy/item.py", line 56, in __getitem__
    return self._values[key]
KeyError: 'image_link'

输出报告

'log_count/DEBUG': 57,
 'log_count/ERROR': 27,
 'log_count/INFO': 7,
 'log_count/WARNING': 2,

怎么了?显然 image_link 存在于 items.py 中。衷心感谢任何帮助或提示。

【问题讨论】:

  • 您是否定义了任何其他项目类别?您是否在蜘蛛的其他任何地方产生物品?另外,#other stuffs here 发生了什么?你还在做其他的项目分配吗?
  • @Rejected 我发现了问题。谢谢你 。一会儿再分享。

标签: python scrapy keyerror


【解决方案1】:

我发现了问题

问题是item['image_link'] 的添加没有被回传parse 函数。

已解决

我解决了这个问题

_item = Request(_item['link'], callback=self.parse_detail, meta={'_item': _item})
yield _item

我猜这会将更改从 parse_detail 函数返回到 _item

【讨论】:

  • 这与从原始问题中删除 yield _item 行相同。换句话说,_item 不再从parse 方法返回,并且不会通过管道。如果这是您的意图,那就太好了。
【解决方案2】:

我认为这部分代码有错误:

        if _item['image_link'][0].endswith('gif'):
        _item = self.NO_IMAGE

在这种情况下,您使用 self.NO_IMAGE 覆盖所有 _item
应该是:

        if _item['image_link'][0].endswith('gif'):
        _item['image_link'] = self.NO_IMAGE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-15
    • 2017-05-21
    • 2019-11-15
    • 2020-04-24
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    相关资源
    最近更新 更多