【问题标题】:removing null data using scrapy使用scrapy删除空数据
【发布时间】:2020-04-27 13:59:46
【问题描述】:

我正在使用 scrapy 从某个网站上刮取数据,但刮取的数据充满了我不想要的空值,因此为了清理我提取的数据,我更改了 pipeline.py 脚本。当我提取一个或两个值时它就起作用了,它就像一个魅力。但是当我提取多个值并且由于每个提取的行上至少有一个空值时,算法最终会删除我几乎所有的数据。有没有办法阻止这种情况发生?

这是我用来删除空数据的代码


class ConfigSpiderPipeline(object):
    def process_item(self, item, spider):
        item['task_id'] = task_id
        if col is not None:
            if not(all(item.values())):
                raise DropItem()
            else:
                col.save(item)
                return item

【问题讨论】:

  • 你能分享一个违背你意愿被丢弃的示例项目吗?
  • 例如,我有一个带有 id、标题和标题的文档,如果标题或标题为空,我上面使用的方法最终会删除整个文档,并且由于大多数文档都有它们中的空值我最终会刮掉空结果
  • 使用spider.logging.debug('<message>') 来调试正在发生的事情。 DropItem 是在意外情况下引发的吗? col 曾经是 None 吗?

标签: python web-scraping scrapy css-selectors data-processing


【解决方案1】:

如果您只想删除所有值为 None 的项目,您应该使用 'any' 而不是 all:

class ConfigSpiderPipeline(object):
    def process_item(self, item, spider):
        item['task_id'] = task_id
        if col is not None:
            if not(any(item.values())):
                raise DropItem()
            else:
                col.save(item)
                return item

或者更清楚:

class ConfigSpiderPipeline(object):
    def process_item(self, item, spider):
        item['task_id'] = task_id
        if col is not None:
            if any(item.values()):
                col.save(item)
                return item
            else:
                raise DropItem()

【讨论】:

  • 我尝试使用它,但它只删除了所有值为 none 的项目>
  • 您的问题可能出在其他地方,因为此管道仅在字典中至少有 1 个值时保存项目,并且仅在所有值都为空时才删除该项目。也许也提供蜘蛛本身的代码
  • 我在这里提出了另一个问题,其中包含更多信息,包括我的蜘蛛文件和项目文件:stackoverflow.com/questions/61535398/…
猜你喜欢
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 2020-03-13
相关资源
最近更新 更多