栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【Python爬虫】数据解析之re解析

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Python爬虫】数据解析之re解析

一个人走得远了,就会忘记自己为了什么而出发,希望你可以不忘初心,不要随波逐流,一直走下去
曆 欢迎关注点赞收藏留言
濾 本文由 程序喵正在路上 原创,CSDN首发!
 系列专栏:Python爬虫
 首发时间:2022年8月9日
✅ 如果觉得博主的文章还不错的话,希望小伙伴们三连支持一下哦

阅读指南
  • 数据解析概述
  • 正则表达式
  • re模块
    • 1. findall
    • 2. finditer
    • 3. search
    • 4. match
    • 5. compile()
    • 6. 提取正则中的内容

数据解析概述

前面,我们基本上掌握了抓取整个网页的基本技能,但是,在大多数情况下,我们并不需要整个网页的内容,只是需要那么一小部分,怎么办呢?

接下来,我们将会学习三种解析方式:

  1. re解析
  2. bs4解析
  3. xpath解析

这三种方式可以混合进行使用,完全以结果为导向,只要能拿到你想要的数据,用什么方案并不重要,当你掌握了这些之后,再考虑性能的问题

正则表达式

正则表达式(Regular Expression),是一种使用表达式的方式对字符串进行匹配的语法规则

其实我们抓取到的网页源代码,本质上就是一个超长的字符串,想从里面提取内容,用正则再合适不过了

正则表达式的优点:速度快,效率高,准确性高;正则表达式的缺点:新手上手难度有一点点高

不过只要掌握了正则编写的逻辑关系,写出一个提取页面内容的正则其实并不复杂

正则的语法:使用元字符进行排列组合用来匹配字符串

推荐一个在线正则表达式测试网站

元字符:具有固定含义的特殊符号

常用元字符有:

元字符描述
.匹配除换行符以外的任意字符
w匹配字母或数字或下划线
s匹配任意的空白符
d匹配数字
n匹配一个换行符
t匹配一个制表符
^匹配字符串的开始
$匹配字符串的结尾
W匹配非字母或数字或下划线
D匹配非数字
S匹配非空白符
a | b匹配字符a或字符b
()匹配括号内的表达式,也表示一个组
[…]匹配字符组中的字符
[^…]匹配除了字符组中字符的所有字符

量词:控制前面的元字符出现的次数

量词描述
*重复零次或更多次
+重复一次或更多次
重复零次或一次
{n}重复n次
{n, }重复n次或更多次
{n, m}重复n到m次

贪婪匹配和惰性匹配

符号对应
.*贪婪匹配
.*?惰性匹配

写爬虫用的最多的就是惰性匹配

我们来看一下几个实例

所以,我们可以发现有这样⼀个规律: .*?表示尽可能少的匹配,.*表示尽可能多的匹配

re模块

学会写正则表达式后,接下来的问题是 —— 怎么在 Python 程序中去使用正则
呢?

答案是 re模块

在re模块中,我们只需要记住下面几个功能就足够使用了

1. findall

findall:匹配字符串中所有的符合正则的内容,返回类型为 list

不是很常用,因为当字符串很长的时候,用列表来处理效率是很低的

代码演示

import re

lst = re.findall(r"d+", "我的电话号是:10086,我的电话号是:10010")
print(lst)

运行结果

2. finditer

finditer 和 findall 差不多,只不过返回类型的是迭代器,从迭代器中拿到内容需要调用 group() 函数

很常用

代码演示

it = re.finditer(r"d+", "我的电话号是:10086,我的电话号是:10010")
for i in it:
    print(i.group())

运行结果

3. search

search 会进行匹配,但是如果匹配到了第⼀个结果,就会返回这个结果的 match 对象;如果匹配不上,search 返回的则是 None

代码演示

s = re.search(r"d+", "我的电话号是:10086,我的电话号是:10010")
print(s.group())

运行结果

4. match

match 只能从字符串的开头进行匹配,所以也不是很常用

代码演示

s = re.match(r"d+", "我的电话号是:10086,我的电话号是:10010")
print(s.group())

运行结果

5. compile()

compile() 可以将⼀个长长的正则进行预加载,方便后面的使用,可以提高一点点效率,并且可以反复使用

代码演示

obj = re.compile(r"d+")

ret = obj.finditer("我的电话号是:10086,我的电话号是:10010")
for it in ret:
    print(it.group())

ret = obj.findall("今天是2022年8月7日")
print(ret)

运行结果

6. 提取正则中的内容

(?P<分组名称>正则),这个式子可以单独从正则匹配的内容中进一步提取内容

代码演示

import re

s = """
 佩奇
 乔治
 熊大
 熊二
 光头强 
 """

# (?P<分组名称>正则),这个式子可以单独从正则匹配的内容中进一步提取内容
obj = re.compile(r"d+)'>(?P.*?)", re.S)  # re.S 让.能匹配换行符

result = obj.finditer(s)
for it in result:
    print(it.group("id") + " " + it.group("name"))

运行结果

笠 这次的分享就到这里啦,继续加油哦^^
 我是程序喵,陪你一点点进步
 有出错的地方欢迎在评论区指出来,共同进步,谢谢啦

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1036956.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号