天天看點

爬蟲代碼編寫中會遇到的字元處理的坑

常見報錯資訊

報錯資訊:

Operand should contain 1 column(s)
           

意思是隻能插入單行,不能插入多行資料

data too long 
           

意思是資料庫字段長度不夠

[Failure instance: Traceback: <class 'KeyError'>: 'job_name'
           

意思是鍵值錯誤,情況一般是CSS選擇器在頁面擷取不到對應的值(比如頁面有變化導緻不是正常頁面)、spider的取值與item的鍵對應不上、還有後面跟colum的一般是資料庫字段與item鍵對不上

常見資料處理方法

1.文章内容、簡介等多行多段的文本資料 [思路來源:

傳送

]

這種資料通常的做法是全部取下來,保留文章裡面的html标簽(如

\n \r等),在item裡面把值轉成str類型,存入資料庫即可。這裡有個新的發現,在爬取廣西人才網的時候,它的文本是這樣的:

1.負責員工飯堂菜品的烹饪

2.員工飯堂物料的購買

3.員工食堂衛生

對應的html結構如下:

<p id="examineSensitiveWordsContent" style="display: block;">
          1.負責員工飯堂菜品的烹饪
          <br>2.員工飯堂物料的購買
          <br>3.員工食堂衛生
</p>
           

問題就在這裡! 這樣的值看似一個完整的文本,但是傳遞到item後由于

标簽的存在,就會變成一條一條的資料:

1.負責員工飯堂菜品的烹饪
           
2.員工飯堂物料的購買
           
3.員工食堂衛生
           

而不是我想象中的一個完整文本:

1.負責員工飯堂菜品的烹饪,2.員工飯堂物料的購買,3.員工食堂衛生
           

這樣的資料存入資料庫,就會報錯

Operand should contain 1 column(s)

應對這種問題,解決的辦法就是在資料傳遞到item之前,在spider取值的時候就對

進行處理,可以用replace把它替換掉。

在廣西人才網這個爬蟲中,我的做法是用.join()方法來清除

,.join()的介紹如下:

  • 描述:Python join() 方法用于将序列中的元素以指定的字元連接配接生成一個新的字元串。
  • 文法:str.join(sequence)
  • 參數:sequence -- 要連接配接的元素序列
  • 傳回值:傳回通過指定字元連接配接序列中元素後生成的新字元串。

它的代碼示例:

str = "-";
seq = ("a", "b", "c"); # 字元串序列
print str.join( seq );
           

得到輸出是 a-b-c

是以廣西人才網爬蟲這裡,我在spider檔案建立一個方法,用于清除br:

def clear_br(self, value):
        """
        文本中包含有<br>标簽的話,傳值到itme中就不會是整個文本,而是一條一條的資料
            儲存到資料庫的時候會報錯:Operand should contain 1 column(s)
            那就要将文本裡面的<br>換成其他,由于傳遞過來的value是一個清單list,是以用for循環把元素replace也可以
            這裡用.join()方法把清單裡的所有元素用逗号拼接成字元串
        """
        value = ','.join(value)
        return value
           

然後itemloader指派的時候這樣寫:

p_centent = response.css('#examineSensitiveWordsContent::text').extract()
        iloaders.add_value("job_content", self.clear_br(p_centent))  # 工作内容及要求
           

意思是在取到文本後調用clear_br函數将list清單裡面的元素用逗号拼接,最後傳回一個字元串。這樣就能達到正常入庫的需求了。