Scrapy如何使用itemloader填充空项目?

我正在尝试抓取一个电子商务网站。我的目标是获取卖家信息。

我使代码比实际代码简单

当我的蜘蛛访问没有卖方数据的页面时,我的项目字段'company''owner'填充为None。 是的,可以在我的字段中填充“无”。但是我的问题是我的田地不见了!

# My spider
class GmarketSpider(CrawlSpider):
    name = 'gmarket'
    allowed_domains = ['gmarket.co.kr']
    start_urls = ['http://www.gmarket.co.kr/']
    rules = (
        Rule(callback='parse_item',follow=True),)

    def parse_item(self,response):
        loader = GmarketLoader(item=GmarketItem(),response=response)
        loader.add_xpath('company','//something')
        loader.add_xpath('owner','//something')
        return loader.load_item()


# My item
class GmarketItem(scrapy.Item):
    company = scrapy.Field()
    owner = scrapy.Field()



# My loader
class GmarketLoader(ItemLoader):
    default_input_processor = Identity()
    default_output_processor = TakeFirst()


# My pipeline
class InvalidPagePipeline(object):

    def process_item(self,item,spider):
        if item['owner'] is None: # This line gives me an error
            raise DropItem()
        else:
            return item

请参阅我的管道代码。我检查了item ['owner']的值,该页面是否有效。如果页面无效,那么我希望item ['owner']填充为None。但这给了我一个错误,因为“所有者”键完全消失了。

这是错误消息

2019-11-05 20:22:57 [scrapy.core.scraper] ERROR: Error processing {'market': ['Gmarket'],'url': ['https://sslmember2.gmarket.co.kr/FindPW/FindPW?targetUrl=http%3a%2f%2fmyg.gmarket.co.kr%2f']}
Traceback (most recent call last):
  File "d:\python projects\sellerinfoscraper\venv\lib\site-packages\twisted\internet\defer.py",line 654,in _runCallbacks
    current.result = callback(current.result,*args,**kw)
  File "D:\Python Projects\SellerInfoScraper\sellerInfo\sellerInfo\pipelines.py",line 14,in process_item
    if item['owner'] is None:
  File "d:\python projects\sellerinfoscraper\venv\lib\site-packages\scrapy\item.py",line 91,in __getitem__
    return self._values[key]
KeyError: 'owner'

它说KeyError: 'owner'

如何使用ItemLoader填充None值的项目字段? 我知道我可以不使用ItemLoader来解决此问题,但是我不想使用此功能。

limei2009 回答:Scrapy如何使用itemloader填充空项目?

默认情况下,scrapy 的 ItemLoader 会丢弃任何 None 字段

要解决此问题,您需要确保加载程序将使用其他值,例如空字符串:""

from scrapy.loader import ItemLoader
from scrapy.loader.processors import Compose

def default_action(value):
    return value or ''

class MyLoader(ItemLoader):
    default_output_processor = Compose(default_action)

例如,它的行为如下:

>>> l = MyLoader()
>>> l.add_value('company',None)
>>> l.load_item()
{}
>>> l.add_value('company','')
>>> l.load_item()
{'company': ['']}
本文链接:https://www.f2er.com/3159788.html

大家都在问