常見報(bào)錯(cuò)信息
報(bào)錯(cuò)信息:
Operand should contain 1 column(s)
意思是只能插入單行,不能插入多行數(shù)據(jù)
報(bào)錯(cuò)信息:
data too long
意思是數(shù)據(jù)庫(kù)字段長(zhǎng)度不夠
報(bào)錯(cuò)信息:
[Failure instance: Traceback: <class 'KeyError'>: 'job_name'
意思是鍵值錯(cuò)誤,情況一般是CSS選擇器在頁面獲取不到對(duì)應(yīng)的值(比如頁面有變化導(dǎo)致不是常規(guī)頁面)、spider的取值與item的鍵對(duì)應(yīng)不上、還有后面跟colum的一般是數(shù)據(jù)庫(kù)字段與item鍵對(duì)不上
常見數(shù)據(jù)處理方法
1.文章內(nèi)容、簡(jiǎn)介等多行多段的文本數(shù)據(jù) [思路來源:傳送]
這種數(shù)據(jù)通常的做法是全部取下來,保留文章里面的html標(biāo)簽(如
\n \r等),在item里面把值轉(zhuǎn)成str類型,存入數(shù)據(jù)庫(kù)即可。這里有個(gè)新的發(fā)現(xiàn),在爬取廣西人才網(wǎng)的時(shí)候,它的文本是這樣的:
1.負(fù)責(zé)員工飯?zhí)貌似返呐腼?/p>
2.員工飯?zhí)梦锪系馁?gòu)買
3.員工食堂衛(wèi)生
對(duì)應(yīng)的html結(jié)構(gòu)如下:
<p id="examineSensitiveWordsContent" style="display: block;">
1.負(fù)責(zé)員工飯?zhí)貌似返呐腼? <br>2.員工飯?zhí)梦锪系馁?gòu)買
<br>3.員工食堂衛(wèi)生
</p>
問題就在這里! 這樣的值看似一個(gè)完整的文本,但是傳遞到item后由于
標(biāo)簽的存在,就會(huì)變成一條一條的數(shù)據(jù):
1.負(fù)責(zé)員工飯?zhí)貌似返呐腼?
2.員工飯?zhí)梦锪系馁?gòu)買
3.員工食堂衛(wèi)生
而不是我想象中的一個(gè)完整文本:
1.負(fù)責(zé)員工飯?zhí)貌似返呐腼儯?.員工飯?zhí)梦锪系馁?gòu)買,3.員工食堂衛(wèi)生
這樣的數(shù)據(jù)存入數(shù)據(jù)庫(kù),就會(huì)報(bào)錯(cuò)
Operand should contain 1 column(s)
應(yīng)對(duì)這種問題,解決的辦法就是在數(shù)據(jù)傳遞到item之前,在spider取值的時(shí)候就對(duì)
進(jìn)行處理,可以用replace把它替換掉。
在廣西人才網(wǎng)這個(gè)爬蟲中,我的做法是用.join()方法來清除
,.join()的介紹如下:
- 描述:Python join() 方法用于將序列中的元素以指定的字符連接生成一個(gè)新的字符串。
- 語法:str.join(sequence)
- 參數(shù):sequence -- 要連接的元素序列
- 返回值:返回通過指定字符連接序列中元素后生成的新字符串。
它的代碼示例:
str = "-";
seq = ("a", "b", "c"); # 字符串序列
print str.join( seq );
得到輸出是 a-b-c
所以廣西人才網(wǎng)爬蟲這里,我在spider文件新建一個(gè)方法,用于清除br:
def clear_br(self, value):
"""
文本中包含有<br>標(biāo)簽的話,傳值到itme中就不會(huì)是整個(gè)文本,而是一條一條的數(shù)據(jù)
保存到數(shù)據(jù)庫(kù)的時(shí)候會(huì)報(bào)錯(cuò):Operand should contain 1 column(s)
那就要將文本里面的<br>換成其他,由于傳遞過來的value是一個(gè)列表list,所以用for循環(huán)把元素replace也可以
這里用.join()方法把列表里的所有元素用逗號(hào)拼接成字符串
"""
value = ','.join(value)
return value
然后itemloader賦值的時(shí)候這樣寫:
p_centent = response.css('#examineSensitiveWordsContent::text').extract()
iloaders.add_value("job_content", self.clear_br(p_centent)) # 工作內(nèi)容及要求
意思是在取到文本后調(diào)用clear_br函數(shù)將list列表里面的元素用逗號(hào)拼接,最后返回一個(gè)字符串。這樣就能達(dá)到正常入庫(kù)的需求了。