天天看點

Scrapy——ItemLoader空值報錯問題ItemLoader空值報錯問題

ItemLoader空值報錯問題

1. 問題描述

1) 目标網站:https://news.cnblogs.com/

2) 問題背景:

在抓取文章的tags時,有些文章有這個資訊,有些文章沒有這個資訊。scrapy-spider在解析的時候使用itemloader機制解析填充資料。但是當遇到頁面沒有這個屬性的文章時,解析為空,itemloader預設不填充,資料對象為None。在向資料庫儲存資料時就會報錯keyerror。

2. 解決思路

1) 參考網上文章

大概思路就是:要麼不用itemloader,要麼就重載Mapcompose對象。

2) 靈光一現解決方案:

修改之前的源碼:

修改之後的源碼

item_loader.add_xpath('tags', xpath=".//a[@class='catalink']/text()")
item_loader.add_value('tags', 'null')
           

解釋:

可以将add_xpath()函數和add_value()函數配合使用。

經過測試,将add_xpath()函數寫在add_value()之前,那麼如果前者沒有比對到資料時,就會将add_value()函數中的value值到字段中,測試結果是xpath比對到的item按照xpath比對結果填充字段,沒有比對到xpath的item按照add_value填充了字段。

反過來,如果将add_value()函數寫在add_xpath()之前,則優先比對add_value()函數,測試結果也是全都變成了add_value()函數中的“null”字元串了。

也就是說這樣修改後,代碼邏輯就變成了,‘add_xpath()'比對到了就填充比對結果,沒有比對到,就填充’add_value’中的預設值。

3) 重載ItemLoader類中的add_xpath()函數

源碼中的add_xpath():

def add_xpath(self, field_name, xpath, *processors, **kw):
    values = self._get_xpathvalues(xpath, **kw)
    self.add_value(field_name, values, *processors, **kw)
           

根據源碼可以看出,add_xpath()函數通過xpath比對之後也是要調用add_value()函數填充資料,是以可以在調用add_value()函數填充之前,添加判斷邏輯,先判斷values是否為空,如果values為空就給一個預設值讓add_value()填充,如果values不為空,就按照values填充。

def add_xpath(self, field_name, xpath, *processors, **kw):
    values = self._get_xpathvalues(xpath, **kw)
    if values:
    	self.add_value(field_name, values, *processors, **kw)
    else:
    	self.add_value(field_name, 'null', *processors, **kw)