我正在使用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中处理这个问题的最佳方法是什么?
答案 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)