常见报错信息
报错信息:
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列表里面的元素用逗号拼接,最后返回一个字符串。这样就能达到正常入库的需求了。