爬虫代码编写中会遇到的字符处理的坑

常见报错信息

报错信息:

Operand should contain 1 column(s)

意思是只能插入单行,不能插入多行数据


报错信息:

data too long 

意思是数据库字段长度不够


报错信息:

[Failure instance: Traceback: : 'job_name'

意思是键值错误,情况一般是CSS选择器在页面获取不到对应的值(比如页面有变化导致不是常规页面)、spider的取值与item的键对应不上、还有后面跟colum的一般是数据库字段与item键对不上


常见数据处理方法

1.文章内容、简介等多行多段的文本数据 [思路来源:传送]

这种数据通常的做法是全部取下来,保留文章里面的html标签(如
\n \r等),在item里面把值转成str类型,存入数据库即可。这里有个新的发现,在爬取广西人才网的时候,它的文本是这样的:

1.负责员工饭堂菜品的烹饪

2.员工饭堂物料的购买

3.员工食堂卫生

对应的html结构如下:

1.负责员工饭堂菜品的烹饪
2.员工饭堂物料的购买
3.员工食堂卫生

问题就在这里! 这样的值看似一个完整的文本,但是传递到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):
        """
        文本中包含有
标签的话,传值到itme中就不会是整个文本,而是一条一条的数据 保存到数据库的时候会报错:Operand should contain 1 column(s) 那就要将文本里面的
换成其他,由于传递过来的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列表里面的元素用逗号拼接,最后返回一个字符串。这样就能达到正常入库的需求了。

你可能感兴趣的:(爬虫代码编写中会遇到的字符处理的坑)