删除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中无动画效果的问题