findall()函数的功能是在原始文本中寻找所有符合匹配规则的文本内容
使用规则:re.findall(匹配规则, 原始文本)
例如,提取“Hello 123 world 456 Python大数据教学789”里的所有三位数字
import re
content = 'Hello 123 world 456 Python大数据教学789'
result = re.findall('\d\d\d',content)
print(result)
输出结果:
[‘123’, ‘456’, ‘789’]
规则符号:
获取文本A与文本B之间的内容,并不需要知道它的确切长度及格式,但需要知道在哪两个内容之间
使用规则:
文本A(.*?)文本B
例如,提取规则文本中的内容
import re
res = '文本A城市轨道交通与物流学院文本B,新闻标题文本A夺冠文本B,文本ACCTV中央电视台报导文本B'
p_source = '文本A(.*?)文本B'
source = re.findall(p_source, res)
print(source)
输出结果:
[‘城市轨道交通与物流学院’, ‘夺冠’, ‘CCTV中央电视台报导’]
通常我们爬取网页都是规则的,只要找到其中的规律,即可批量提取其信息
(.*?)用于获取文本A与文本B之间的内容,而不加括号则是因为文本A与文本B之间的内容,经常变动或者说没有规律,无法匹配或者说我们不想要其中的内容,就需要用到它了
使用规则:
文本C.*?文本D
例如:
import re
res = '文本C<变化的网址>文本D新闻标题
'
p_title = '文本C.*?文本D(.*?)
'
title = re.findall(p_title, res)
print(title)
输出结果:
[‘新闻标题’]
网页实战例子:
import re
res = '阿里巴巴代码竞赛现全球首位AI评委 能为代码质量打分'
p_title = '.*?>(.*?)'
title = re.findall(p_title, res)
print(title)
输出结果:
[’< em >阿里巴巴< /em >代码竞赛现全球首位AI评委 能为代码质量打分’]
这里的.*?代表的就是< h3 class=“c-title”>与>之间的内容
re.S的做用手在使用findall()查找时,可以自动考虑换行的影响,使得.*?可以匹配换行
使用规则:
re.findall(匹配规则,原始文本,re.S)
例如,爬取网页中的链接,标题:
import re
res = '''
阿里巴巴代码竞赛现全球首位AI评委 能为代码质量打分
'''
p_href = '.*?
p_title = '.*?>(.*?)
'
href = re.findall(p_href, res, re.S)
title = re.findall(p_title, res, re.S)
print(href)
print(title)
# 清除换行符号(利用的是strip()函数)
for i in range(len(title)):
title[i] = title[i].strip()
print(title)
输出结果:
[‘https://baijiahao.baidu.com/s?id=1631161702623128831&wfr=spider&for=pc’]
[’\n < em>阿里巴巴< /em>代码竞赛现全球首位AI评委 能为代码质量打分\n ‘]
[’< em>阿里巴巴< /em>代码竞赛现全球首位AI评委 能为代码质量打分’]
利用sub()函数
使用规则:
re.sub(需要替换的内容,替换值,原字符串)
如上面我们求到了 [’< em>阿里巴巴< /em>代码竞赛现全球首位AI评委 能为代码质量打分’],进行数据清洗:
import re
title = ['阿里巴巴代码竞赛现全球首位AI评委 能为代码质量打分']
title[0] = re.sub('<.*?>', '', title[0])
print(title[0])
输出结果:
阿里巴巴代码竞赛现全球首位AI评委 能为代码质量打分
特别的:
在正则表达式中 . 、* 、?、都有特殊的意义,若要替换他们,则需要加上[]
例如:
city = '*中国北京'
city1 = re.sub('[*]', '', city)
print(city1)
输出结果:
中国北京