数据处理(玩转python网络爬虫)

从网页上采集的数据后,大多数的数据是杂乱无章的,这时就需要对数据进行加工处理,去掉一些垃圾数据才能得到我们想要的数据。常用的方法有以下三种方法:字符串操作,正则表达式和第三方模块库。

一、字符串操作(截取、替换、查找和分割)

(1)截取:字符串[开始位置:结束位置:间隔位置]

  • 开始位置为0,正数代表从左边位置开始,负数代表从右边开始,默认从0开始
  • 结束位置是被截取的字符串位置,默认取到字符串尾部。
  • 间隔位置默认为1,实际字符串不做处理。
# 字符串截取
str = "ABCDEFG"
# 截取第一位到第三位的字符
print("截取的第一位到第三位的字符:" + str[:3:])
# 与原字符串顺序相反的字符串
print("与原字符串顺序相反的字符串:" + str[::-1])

(2)替换:字符串.replace('被替换的内容','替换后的内容')

注意:使用replace替换的字符串后仅为临时变量,需要重新赋值才能保存。

# 字符串替换
str = "ABCABCABC"
# 单个字符替换
print(str.replace("C", "V"))
# 多个字符替换
print(str.replace("BC", "WV"))

(3)查找:字符串.find('要查找的内容',开始位置,结束位置)

  • 开始位置和结束位置表示要查找的范围,若为零值,则表示要查找所有内容。
  • 找到目标后返回目标第一位内容所在的位置,位置从0开始算,如果没找到就返回-1。
# 字符串查找
str = "ABCDBCABC"
# 全部查找
print(str.find("A"))
# 从字符串第2个到第6个开始查找,找到第一个就会返回位置(BCDBC)
print(str.find("C", 1, 5))

index函数也能同find函数一样实现相同的功能,index是在字符串中查找第一次出现的位置,但是如果找不到就会抛出异常。

# 字符串index查找
str = "ABCDABC"
# 全部查找
print(str.index("A"))
# 从字符串第2个到第6个开始查找,找到第一个就会返回位置(BCDBC)
print(str.index("C", 1, 5))
# 查找不存在的内容
print(str.index("E"))

(4)分割:字符串.split('分割符',分割次数)

  • 如果存在分割次数就仅分割成“分割次数+1”个字符串,如果为空就默认全部分割
  • 分割后返回一个列表类型数据。
# 字符串分割
str = "ABCDABC"
# 分割全部
print(str.split("B"))
# 分割一次
print(str.split("B", 1))

二、正则表达式

(1)正则语法(元字符)

符合正则规则,表示一些不寻常的匹配规则或者通过重复、修改匹配意义来影响正则模式的其他部分

(2)正则处理函数(re模块,常用函数:match,search,findall,sub)

1、re.match(pattern,string,flags=0)

re.match函数尝试从字符串的开头开始匹配一个模式,如果匹配成功就返回一个匹配成功的对象,否则返回一个None。

该函数匹配之后得到一个match对象类型,如果要返回结果那么使用group()或groups()匹配对象函数来获取匹配后的结果。

  • pattern:匹配的正则表达式。
  • string:要匹配的字符串。
  • flags:标志位,用于控制正则表达式的匹配表达式。可选参数:re.I(忽略大小写),re.M(多行模式,改变'^'和'$'的行为),re.S('.'的匹配不受匹配,可匹配任何字符),re.L(字符集本地化),re.U(使预定字符串类\w\W\b\B\s\S\d\D取决于unicode定义的字符属性),re.X(正则模式可以是多行的,忽略空白字符并且可以加入注释)。

2、re.search(pattern,string,flag=0)

扫描整个字符串并返回第一次成功匹配的对象,如果匹配失败,就返回None。

  • pattern:匹配的正则表达式。
  • string:要匹配的字符串。
  • flag:标志位,用于控制正则表达式的匹配方式。同match。

3、re.findall(pattern,string,flag=0)

获取字符串中所有匹配的字符串,并以列表的形式返回。

  • pattern:匹配的正则表达式。
  • string:要匹配的字符串。
  • flag:标志位,用于控制正则表达式的匹配方式。同match。

4、re.sub(pattern,repl,string,count=0,flags=0)

用于替换字符串中的匹配项,如果没有匹配的项,则返回没有匹配的字符串。

  • pattern:匹配的正则表达式。
  • repl:用于替换的字符串。
  • string:要被替换的字符串。
  • count:替换的次数。
  • flag:标志位,用于控制正则表达式的匹配方式。同match。

5、re.split(pattern,string,)

三、Beautiful Soup

Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库。

Beautiful soup支持python标准库的HTMl解析器,还可以结合第三方的解析器解析网页,如lxml,xml,html5lib。

(1)查找全部标签: soup.a,返回第一个标签

若想要获取标签在网页上显示的内容(去除HTML代码):

1、通过getText()获取标签的值。

2、通过str()方式转换为字符串,再使用字符串截取获得的数据。

(2)获取某标签的属性值。

如果HTML的属性含有多个CSS属性,Beautiful Soup会以列表的格式返回结果。

(3)精确查找:find_all(),find()

1、find_all()和find()的区别:

  • find_all()返回的结果是包含一个或多个元素的列表,fand()返回的是第一个符合要求的结果,格式为字符串。
  • 若find_all()没有找到目标则返回空列表,find()找不到目标时返回None。

如果想获取第N个标签a或精确定位到某个标签,则有三种方式:

  • 通过属性定位,只要是标签里具有的属性都可以定位到:soup.find_all('a',id="try")
  • 通过多个属性定位,这样更加精确:soup.find_all('a',class_="efg",id="try")
  • 通过正则表达式进行模糊匹配:soup.find_all('a',href==re,compile("aaa"))

(4)匹配CSS选择器

1、通过id查找:soup.select("#try3")

2、通过class查找:soup.select(".efg")

3、通过属性查找:soup.select('a[class="efg"]')

猜你喜欢

转载自blog.csdn.net/weixin_42351003/article/details/83053575