1. 程式人生 > >【Python】Scrapy ItemLoader 處理空列表讓資料庫欄位為空值

【Python】Scrapy ItemLoader 處理空列表讓資料庫欄位為空值

問題描述

我需要爬取某些招聘網頁上的資訊,但不是所有招聘網頁中展示的資訊都一樣,例如有些網頁上並沒有附上公司網址,而如果沒有需要在資料庫相應的欄位中賦值為空。

方法一:不使用itemLoader

使用extract_first()取得列表第一個元素,預設值為‘’,但這不適用列表中有多個元素,比如不止爬取一個標籤

def parse_detail(self, response):
        article_item = JobBoleArticleItem()
        tag_list = response.css("p.entry-meta-hide-on-mobile a::text").extract_first('')

使用extract()能取得整個列表,但需要再做進一步處理,list型別無法插入資料庫

tag_list = response.css("p.entry-meta-hide-on-mobile a::text").extract()
if not tag_list:
	tag_list.append('')
	return tag_list[0]

方法二:使用ItemLoader

推薦使用ItemLoader

    def parse_job(self, response):
        item_loader = ShixiJobItemLoader(item=ShixiJobItem(), response=response)
        item_loader.add_css("job_name", ".new_job_name::attr(title)")

可以檢視add_css原始碼往下進去可以看到,如果獲取為None就返回一個空列表
而我們需要對空列表賦值為空字元處理
使用itemloader爬取時,返回的資料型別是list,再存入item容器前,是支援對資料進行預處理的,即輸入處理器和輸出處理器,可以通過MapCompose這個類來依次對list的元素進行處理,

但如果list為空則不會進行處理,這種情況需要過載MapCompose類的__call__方法,如下,給vallue增加一個空格str“ ”

class MapComposeCustom(MapCompose):
    #自定義MapCompose,當value沒元素時傳入" "
    def __call__(self, value, loader_context=None):
        if not value:
            value.append(" ")
        values = arg_to_iter(value)
        if loader_context:
            context = MergeDict(loader_context, self.default_loader_context)
        else:
            context = self.default_loader_context
        wrapped_funcs = [wrap_loader_context(f, context) for f in self.functions]
        for func in wrapped_funcs:
            next_values = []
            for v in values:
                next_values += arg_to_iter(func(v))
            values = next_values
        return values

之所以不直接賦值為空字元,是因為TakeFirst類,一般來說都是使用TakeFirst來作為預設輸出處理器,但該函式會篩掉空字元,因此過載該類的__call__

class TakeFirstCustom(TakeFirst):
    def __call__(self, values):
        for value in values:
            if value is not None and value != '':
                return value.strip() if isinstance(value, str) else value

在最後return新增三目運算子,使用strip()對空字元進行刪除處理。
要是不在意資料庫欄位是一個空格,可以不用過載該類

相關推薦

PythonScrapy ItemLoader 處理列表資料庫

問題描述 我需要爬取某些招聘網頁上的資訊,但不是所有招聘網頁中展示的資訊都一樣,例如有些網頁上並沒有附上公司網址,而如果沒有需要在資料庫相應的欄位中賦值為空。 方法一:不使用itemLoader 使用extract_first()取得列表第一個元素,預設值為‘’

Python向函數傳遞列表

urn span () 修改列 定義 been 過程 bottom 怎麽辦 向函數傳遞列表 在實際使用中你會發現,向函數傳遞列表是比較實用的,這種列表可能包含名字、數字、可能更復雜的對象(字典) 假設向一個函數傳遞一堆水果,我們說出我們喜歡所有的水果 def Obj(fru

Python文件處理

sep shu l命令 文本 運行 刪除目錄 如何 空目錄 緩沖 原文地址:http://www.cnblogs.com/juandx/p/4962089.html python 讀寫、創建 文件python中對文件、文件夾(文件操作函數)的操作需要涉及到os模塊和shut

python內建資料結構——列表

【引言】python提供了4個內建資料結構,可以用來儲存任何物件集合,它們分別是列表、元組、字典和集合。python有兩個有序的集合資料結構(列表和元組),列表是其中之一。 1. 列表的概念 列表是一個有序的可變物件索引集合,列表中的每個物件從0開始編號。 與陣列不同的是: 1)列表

Python pymysql模組處理Mysql資料庫

PyMySQL 是在 Python3.x 版本中用於連線 MySQL 伺服器的一個庫,Python2中則使用mysqldb。 PyMySQL 遵循 Python 資料庫 API v2.0 規範,幷包含了 pure-Python MySQL 客戶端庫。 在使用 PyMySQL 之前,我們需要確保

PythonTcp Socket處理粘包與分包問題

測試環境 win10 python3.6 粘包和分包 粘包:傳送方傳送兩個字串”hello”+”world”,接收方卻一次性接收到了”helloworld” 分包:傳送方傳送字串”hel

java list按照 物件 指定多個屬性進行排序

話不多說,上程式碼: package PjectUtils; import java.lang.reflect.Field; import java.text.NumberFormat; import java.util.Collections; import java

MySQL多表聯合查詢(新增查詢、引數設定)

所羅門王說:沒有智慧解決不了的問題。SELECT * from tb_corporation_and_user      人員所在團隊 (`user_id`, `corporation_id` ,  `role_id` ) SELECT * from tb_corporati

Oracle 處理 NVL()函式, NVL2()函式

--1. NVL()函式: --格式:NVL(E1,E2) --說明:若E1為NULL,則函式返回E2,否則返回E1本身。 Select NVL(FQty,0) as qty From T_Sal_Order --如果FQty的值為null,則返回 0 Select NVL(FQty,FAssist

sql 處理資料 如果空轉換成別的

判斷欄位是否為空,如果為空轉成你要的字元 1.oracle : nvl(“欄位名”,’轉換後的值’);//欄位名是雙引號,轉換後的值是單引號 2.sql Server: isnull(“欄位名”

MySql解讀EXPLAIN執行計劃中的key_len 大小的計算規則

解讀EXPLAIN執行計劃中的key_len導讀EXPLAIN中的key_len一列表示什麼意思,該如何解讀?EXPLAIN執行計劃中有一列 key_len 用於表示本次查詢中,所選擇的索引長度有多少位

SpringBoot JPA 分頁升序的時候,怎麼把排序的記錄排在最下面

Sort.Order order = new Sort.Order(direction, column).nullsFirst(); 上面這種寫法不能實現升序的時候將排序欄位為空的記錄排在最後面,百度找了很久,只找到兩篇相關的回答,但是都沒解決問題,請問哪位大神知道怎麼解決這個問題? &

spring boot整合mybatis查詢資料庫返回Map不返回解決

1.出現問題原因 原因1:mybatis的配置即mapper返回對映配置。 原因2:jackson的配置即@ResponseBody序列化配置。 2.解決方式 步驟1:解決原因1 mybatis:configuration: call-setters

postgresql將替換指定

null 表示缺失的值, '' " "表示空值 null 參與的表示式運算都返回null 使用is null 判斷是null is not null 判斷非null nullif(value1, value2) 如果value1 == value2 返回null c

oracle中使用sql查詢時則賦預設

oracle 通過 nvl( )函式sql 查詢時為 空值 賦預設值 oracle 函式介紹之nvl   函式宣告:nvl(col,val)   說明:當col為空時取val作為返回值,當col不為空時取col值。   用處:最主要的是格式化資料,比如計算金額時,不想出現

SpringBoot框架下的SQL查詢結果時返回Map型別

今天在執行業務的時候發現在一次查詢時, 查詢出當一個欄位值為null時,封裝成Map型別返回的物件則不存在該值如:<select id="getUserDetail" parameterType="java.util.Map" resultType="java.util

關於hql中部分關聯時,不報錯而直接查不出欄的記錄

select b.listNo,b.appGNo,b.trGno,b.complex,b.commName,b.commSpec,b.tradeUnit,b.tradeQty,b.unit,b.qty,b.note, c.listNo,c

mysql刪除的資料 mysql中空與NULL的區別

空值與NULL的區別   我們先來理解mysql中空值與NULL的區別是什麼吧   一些剛剛接觸MySQL的孩子,經常會錯誤的認為NULL與空字串’ ’是相同的。這看似是一件不重要的事情,但是在MySQL中,這兩者是完全不同的。NULL是指沒有值,而”則表示值是存在的,

mysql查詢字串時給預設 (2、null時給一預設

1、 case when post_ask_pay.price='' then 10 else post_ask_pay.price end as priceSELECT distinct post_ask_pay.user_id as ask_user_id,post_

PostgreSQL 將替換指定

null 表示缺失的值, ""表示空值 null 參與的表示式運算都返回null 使用is null 判斷是null is not null 判斷非null nullif(value1, value2) 如果value1 == value2 返回null co