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

时间:2017-12-24 14:17:52

标签: python python-3.x scrapy scrapy-spider

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

items.py

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

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

parser.py

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中处理这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

我总是不鼓励使用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

答案 1 :(得分:0)

如果您仍想使用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)