6 爬虫技术基础3—正则表达式

正则表达式基础1—findall()函数

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’]

规则符号:
在这里插入图片描述

正则表达式基础2—非贪婪匹配之(.*?)

获取文本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中央电视台报导’]

通常我们爬取网页都是规则的,只要找到其中的规律,即可批量提取其信息

正则表达式基础3—非贪婪匹配之.*?

(.*?)用于获取文本A与文本B之间的内容,而不加括号则是因为文本A与文本B之间的内容,经常变动或者说没有规律,无法匹配或者说我们不想要其中的内容,就需要用到它了
使用规则:

文本C.*?文本D

例如:

import re
res = '<h3>文本C<变化的网址>文本D新闻标题</h3>'
p_title = '<h3>文本C.*?文本D(.*?)</h3>'
title = re.findall(p_title, res)
print(title)

输出结果:

[‘新闻标题’]

网页实战例子:

import re
res = '<h3 class="c-title"><a href="网址" data-click="{一堆英文}"><em>阿里巴巴</em>代码竞赛现全球首位AI评委 能为代码质量打分</a>'
p_title = '<h3 class="c-title">.*?>(.*?)</a>'
title = re.findall(p_title, res)
print(title)

输出结果:

[‘< em >阿里巴巴< /em >代码竞赛现全球首位AI评委 能为代码质量打分’]

这里的.*?代表的就是< h3 class=“c-title”>与>之间的内容

正则表达式基础4—自动考虑换行的修饰符re.S

re.S的做用手在使用findall()查找时,可以自动考虑换行的影响,使得.*?可以匹配换行
使用规则:

re.findall(匹配规则,原始文本,re.S)

例如,爬取网页中的链接,标题:

import re
res = '''<h3 class="c-title">
 <a href="https://baijiahao.baidu.com/s?id=1631161702623128831&amp;wfr=spider&amp;for=pc"
    data-click="{
      一堆我们不关心的英文或者是俄文
      }"
                target="_blank"
    >
      <em>阿里巴巴</em>代码竞赛现全球首位AI评委 能为代码质量打分
    </a>
'''

p_href = '<h3 class="c-title">.*?<a href="(.*?)"'
p_title = '<h3 class="c-title">.*?>(.*?)</a>'
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评委 能为代码质量打分’]

正则表达式基础5—数据清洗

利用sub()函数
使用规则:

re.sub(需要替换的内容,替换值,原字符串)

如上面我们求到了 [‘< em>阿里巴巴< /em>代码竞赛现全球首位AI评委 能为代码质量打分’],进行数据清洗:

import re
title = ['<em>阿里巴巴</em>代码竞赛现全球首位AI评委 能为代码质量打分']
title[0] = re.sub('<.*?>', '', title[0])
print(title[0])

输出结果:

阿里巴巴代码竞赛现全球首位AI评委 能为代码质量打分

特别的:
在正则表达式中 . 、* 、?、都有特殊的意义,若要替换他们,则需要加上[]
例如:

city = '*中国北京'
city1 = re.sub('[*]', '', city)
print(city1)

输出结果:

中国北京

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啥都鼓捣的小yao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值