删除scrapy中无属性的项目中的属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除scrapy中无属性的项目中的属性相关的知识,希望对你有一定的参考价值。

我正在使用Scrapy抓取一个网站。我从页面中提取了5个项目。以下是我的档案

items.朋友

class ParseItem(scrapy.Item):
    a = scrapy.Field()
    b = scrapy.Field()
    c = scrapy.Field()
    d = scrapy.Field()
    e = scrapy.Field()

我正在解析spiders目录中的数据,这是我正在使用的功能

parser.朋友

def parse_page(self, response):
     item = ParseItem()
     item['a'] = response.url
     item['b'] = response.xpath("//h3[@itemprop='title']/text()").extract_first()
     item['c'] = response.xpath("//h3[@itemprop='title']/text()").extract_first()
     item['d'] = response.xpath("//h3[@itemprop='title']/text()").extract_first()
     item['e'] = response.xpath("//h3[@itemprop='title']/text()").extract_first()

我想忽略所有返回None的字段。一种方法是使用以下

tmp1 = response.url

if tmp1 is not None:
    item['a'] = tmp1

tmp2 = response.xpath("//h3[@itemprop='title']/text()").extract_first()

if tmp2 is not None:
    item['b'] = tmp2

... and so on

但是如果字段数量增加,这将变得混乱。在scrapy中处理这个问题的最佳方法是什么?

答案

如果您仍想使用Item类,请使用此类

# -*- coding: utf-8 -*-
from scrapy import Item, Field

class DynamicItem(Item):
    def __setitem__(self, key, value):
        self._values[key] = value
        self.fields[key] = {}

然后在你的蜘蛛导入这个

from your_project.items import DynamicItem

这就是你如何yield

yield DynamicItem(item1= item1_value, item2= item2_value)

在您的情况下更容易

 item = {}
 item['a'] = response.url
 item['b'] = response.xpath("//h3[@itemprop='title']/text()").extract_first()
 item['c'] = response.xpath("//h3[@itemprop='title']/text()").extract_first()
 item['d'] = response.xpath("//h3[@itemprop='title']/text()").extract_first()
 item['e'] = response.xpath("//h3[@itemprop='title']/text()").extract_first()

 item_to_yield = {}
 for k, v in item.iteritem():
     if v is not None:
         item_to_yield[k] = item[k]
 yield DynamicItem(**item_to_yield)
另一答案

我总是不鼓励使用Item类,我从来没用过。而只是使用Python字典。

def parse_page(self, response):
     item = {}
     item['a'] = response.url
     item['b'] = response.xpath("//h3[@itemprop='title']/text()").extract_first()
     item['c'] = response.xpath("//h3[@itemprop='title']/text()").extract_first()
     item['d'] = response.xpath("//h3[@itemprop='title']/text()").extract_first()
     item['e'] = response.xpath("//h3[@itemprop='title']/text()").extract_first()

     for k, v in item.iteritem():
         if v is None:
             del item[k]
     yield item

以上是关于删除scrapy中无属性的项目中的属性的主要内容,如果未能解决你的问题,请参考以下文章

一行代码解决CoreData托管对象属性变更在SwiftUI中无动画效果的问题

java 子类继承父类属性 this打点调用初始化父类属性 父类中无有参构造方法

将多个输出中的hls属性设置为单独的片段代码

如何初始化片段中的绑定属性以使双向数据绑定工作

vf中无controlsource属性的是

Scrapy中的response对象的属性及方法,附加mate属性的使用方法