在学习爬虫的时候,除了要学会爬取数据以外,还要学习如何解析数据,在这里介绍常用的三种解析爬虫数据的方法,分别是正则表达式、Beautiful Soup、还有xpath。
正文:首先分别介绍三种解析数据方式各自的特点:
Re(Regular expression 正则表达式)速度快效率高准确性高,但使用起来可能相较于其他两种方法会更加的复杂多变,要学习的一些符号规则也会多一点。
bs4(Beautiful Soup)最简单但执行起来效率并不高,它的原理是通过对HTML的标签、属性以及属性值来进行定位的。
xpath最流行,语法规则比较舒服,使用起来效率更高更容易上手,xpath是在XML文档中搜索内容的一门语言课,也是现在爬虫用的比较多的一种解析数据的方式。
接下来进入到这三种方式当中Re的实例:
其中Re的常用的符号规则:
元字符:具有固定含义的特殊符号
常用元字符:
1 . 匹配除换行符以外的任意字符
2 w 匹配字母或数字或下划线
3 s 匹配任意的空白符
4 d 匹配数字
5 n 匹配一个换行符
6 t 匹配一个制表符
7 ^ 匹配字符串的开始
8 $ 匹配字符串的结尾
9 W 匹配非字母或数字或下划线
10 D 匹配非数字
11 S 匹配非空白符
12 a|b 匹配字符a或b
13 () 匹配括号内的表达式,也表示一个组
14 [...] 匹配字符串中的字符
15 [^...] 匹配除了字符组中字符的所有字符
量词:控制前面的元字符出现的次数
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n次到m次
贪婪匹配和惰性匹配
.* 贪婪匹配
.*? 惰性匹配
import re
# findall: 匹配字符串中所有符合正则的内容,返回的是列表,因为列表效率并不高所以一般不用findall
lst = re.findall(r"d+","我的电话是: 13267584321, 门牌号:432")
print(lst)
# finditer: 匹配字符串中所有的内容【返回的是迭代器】,从迭代器中拿到内容需要.group()
it = re.finditer(r"d+","我的电话是: 13267584321, 门牌号:432")
for i in it:
print(i.group())
# search全文搜索找到一个结果就返回,返回的结果是match对象,拿数据需要.group()
s = re.search(r"d+","我的电话是: 13267584321, 门牌号:432")
print(s.group())
# match从头开始匹配
m = re.match(r"d+","13267584321, 门牌号:432")
print(s.group())
#预加载正则表达式, 美化代码,提高一丢丢的效率
obj = re.compile(r"d+")
ret = obj.finditer("我的电话是: 13267584321, 门牌号:432")
for i in ret:
print(i.group())
# 三个引号的作用即是所写即所得,不需要用换行符 在单引号里双引号将变成普通符号,反之亦然
s = '''
林天封
正向站
正中行
郑浩然
'''
#(?P<"分组名字">正则)可以单独从正则匹配内容中进一步提取内容
obj = re.compile(r".*?)'>d+)'>(?P.*?)", re.S) # re.S 表示让.能匹配换行符
result = obj.finditer(s)
for it in result:
print(it.group("first"),end=" ")
print(it.group("second"),end=" ")
print(it.group("third"))
总结:
这里的实例仅仅是入门而已,还有很多的符号没有涉及到,如果大家要系统地去学习正则表达式,则需要把常用的几种符号给弄清楚,并多做几次实验,也试着从网页HTML代码中提取自己想要的内容,后续将会更新bs4还有xpath的一些简单的实例。



