re模块:最适合在script中提取内容
re是python正则模块标准库
在线正则表达式测试:https://tool.oschina.net/regex
常用元字符:
. 匹配除换行符以外的任意字符
w 匹配字母或数字或下划线
s 匹配任意的空白字符,空格,制表符,换页符
d 匹配0~9 之间的数字
匹配一个换行符
^ 匹配字符串的开始
$ 匹配字符串的结束
S 匹配任何非空白字符
W 匹配非字母或数字或下划线
D 匹配非数字
() 匹配括号内的表达式,也表式一个组
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中字符的所有字符
量词:
控制前面的元字符出现的次数
* 重复0次或更多次
+ 重复1次或更多次
? 重复0次或1次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
贪婪匹配和惰性匹配
.* 贪婪匹配
.* ? 贪婪匹配
re模块中爬虫程序主要使用的功能
findall 查找所有,返回list
finditer 查找所有,返回迭代器,需用for循环取出里面的值
search 会进行匹配,如果匹配到了一个结果就会返回这个结果,如果匹配不上就返回none
match 只能从字符串的开头进行匹配
compile() 将一个长正则进行预加载,方便后面的使用
单独提取正则中的内容:
可通过给分组起名字的方法对正则中的内容进行单独提取
基本结构:
import re
obj = re.compile(r"",re.S) #re.S可以让.匹配任意字符
例:
import re
# findall:匹配字符串中所有符合正则的内容
lst = re.findall(r"d+","我的电话是:10086,他的电话是:10010")
print(lst)
# finditer:匹配字符串中所有的内容【返回的是迭代器】,从迭代器中拿到内容需要.group()函数
it = re.finditer(r"d+","我的电话是:10086,他的电话是:10010")
for i in it:
print(i.group())
# search:全文匹配找到一个结果就返回,返回的结果是match对象,如果拿不到结果返回none,拿数据需要.group()函数
s = re.search(r"d+","我的电话是:10086,他的电话是:10010")
print(s.group())
# match:从头开始匹配
s = re.match(r"d+","111,我的电话是:10086,他的电话是:10010")
print(s.group())
# 预加载正则表达式,可在多处重复使用
obj = re.compile(r"d+")
ret = obj.finditer("我的电话是:10086,他的电话是:10010")
for it in ret:
print(it.group())
ret = obj.findall("我的电话是:10086,他的电话是:10010")
print(ret)
# 单独提取正则中的内容:(?P<分组名字>正则):单独从正则匹配的内容中再进一步提取所需要的内容
st = """
<div class='西游记'><span id='1'>孙悟空</span></div>
<div class='水浒传'><span id='2'>林冲</span></div>
<div class='三国演义'><span id='3'>刘关张</span></div>
<div class='红楼梦'><span id='4'>贾宝玉</span></div>
"""
# (?P<分组名字>正则):单独从正则匹配的内容中再进一步提取所需要的内容
obj = re.compile(r"<div class='.*?'><span id='d+'>(?P<hahaha>.*?)</span></div>",re.S) #re.S可以让.匹配任意字符
rest = obj.finditer(st)
for i in rest:
print(i.group())
print(i.group("hahaha"))