8.网络爬虫—正则表达式RE实战

news2024/12/25 23:47:40

8.网络爬虫—正则表达式RE实战

    • 正则表达式(Regular Expression)
    • re.I
    • re.A
    • re.S
    • re.M
    • re.X
    • re.L
    • re.U
    • 美某杰实战
      • 写入csv文件:

前言
🏘️🏘️个人简介:以山河作礼。
🎖️🎖️:Python领域新星创作者,CSDN实力新星认证
📝​📝​此专栏文章是专门针对网络爬虫基础,欢迎免费订阅!
📝​📝第一篇文章《1.认识网络爬虫》获得全站热榜第一,python领域热榜第一, 第四篇文章《4.网络爬虫—Post请求(实战演示)》全站热榜第八,欢迎阅读!
🎈🎈欢迎大家一起学习,一起成长!!
💕💕悲索之人烈焰加身,堕落者不可饶恕。永恒燃烧的羽翼,带我脱离凡间的沉沦。
在这里插入图片描述

正则表达式(Regular Expression)

正则表达式(Regular Expression)是一种用于匹配字符串的工具,它可以根据特定的规则来匹配字符串。正则表达式通常由一组字符和字符集合组成,其中字符集合定义了匹配的字符类型和位置。

re.I

🧾 🧾 语法: re.IGNORECASE 或简写为 re.I

🧾 🧾 含义: 进行忽略大小写匹配

在Python中,可以使用re模块中的re.IGNORECASE标志来实现正则表达式的忽略大小写。例如,如果要匹配字符串apple,可以使用以下代码:

import re  
  
pattern = re.compile('apple', re.I)  
text = 'The apple is red'  
  
match = pattern.search(text)  
  
if match:  
    print(match.group())  
else:  
    print('未找到匹配的字符串')

运行结果:
在这里插入图片描述

在上面的代码中,re.I标志被用来匹配字符串apple,这意味着在匹配时忽略大小写。pattern.search(text) 函数返回一个Match对象,如果找到匹配的字符串,则match.group()方法将被调用并打印出来,否则打印出未找到匹配的字符串。

re.A

🧾 🧾 语法: re.ASCII 或简写为 re.A

🧾 🧾 作用: ASCII表示ASCII码的意思,让 \w, \W, \b, \B, \d, \D, \s 和 \S 只匹配ASCII,而不是Unicode

当使用re模块进行正则表达式匹配时,可以使用re.ASCII或re.A标志来匹配ASCII字符集,而不是Unicode字符集。这意味着,\w、\W、\b、\B、\d、\D、\s和\S只会匹配ASCII字符,而不是Unicode字符。

以下是一个使用re.ASCII或re.A标志的简单示例:

import re

# 匹配ASCII字符集中的数字和字母
pattern = re.compile(r'\w+', flags=re.ASCII)
text = 'Hello 世界 123'
match = pattern.findall(text)
print(match)


在这里插入图片描述

在上面的示例中,我们使用re.compile()函数创建了一个正则表达式对象,该对象使用了re.ASCII标志。然后,我们使用该对象的findall()方法在文本中查找匹配项。由于我们使用了re.ASCII标志,所以只有ASCII字符集中的数字和字母被匹配到,而中文字符被忽略。因此,输出结果为[‘Hello’,
‘123’],而不包括’世界’这个中文字符。

re.S

🧾🧾 语法: re.DOTALL 或简写为 re.S

🧾🧾 作用: DOT表示.,ALL表示所有,连起来就是.匹配所有,包括换行符\n。默认模式下.是不能匹配行符\n的

re.DOTALL或简写为re.S是re模块的一个标志,用于指定正则表达式匹配时,".“符号是否能够匹配换行符。当re.DOTALL或re.S标志被设置时,”.“符号将匹配任何字符,包括换行符。如果没有设置这个标志,”."符号将不匹配换行符。

以下是一个使用re.DOTALL标志的示例:

import re

text = 'hello\nworld'
pattern = re.compile('.*', re.DOTALL)
match = pattern.match(text)
print(match.group(0))

运行结果:

'hello\nworld'

可以看到,因为使用了re.DOTALL标志,"."符号匹配了换行符,所以整个文本都被匹配了。

需要注意的是,re.DOTALL标志只对"."符号起作用,其他的元字符和字符类仍然按照原来的规则匹配
如果需要匹配包括换行符在内的所有字符,可以使用如下的正则表达式:

pattern = re.compile('.*', re.DOTALL | re.MULTILINE)

这里使用了re.MULTILINE标志,表示多行匹配,以便"."符号能够匹配换行符。

re.M

🧾 🧾 语法: re.MULTILINE 或简写为 re.M

🧾 🧾 含义: 多行模式,当某字符串中有换行符\n,默认模式下是不支持换行符特性的,比如:行开头和行结尾,而多行模式下是支持匹配行开头的

在Python中,可以使用re模块中的re.MULTILINE标志来实现正则表达式的多行匹配。

例如,如果要匹配字符串apple,可以使用以下代码:


import re

pattern = re.compile('apple', re.MULTILINE)
text = 'The apple is red'

match = pattern.search(text)

if match:
    print(match.group())
else:
    print('未找到匹配的字符串')

运行结果:

在这里插入图片描述

在上面的代码中,re.MULTILINE标志被用来匹配字符串apple,这意味着可以在一行中匹配多个字符串。pattern.search(text)函数返回一个Match对象,如果找到匹配的字符串,则match.group()方法将被调用并打印出来,否则打印出未找到匹配的字符串。

注意:正则语法中^匹配行开头、\A匹配字符串开头,单行模式下它两效果一致,多行模式下\A不能识别\n。

re.X

🧾 🧾 语法: re.VERBOSE 或简写为 re.X

🧾 🧾 作用: 详细模式,可以在正则表达式中加注解

re.VERBOSE 或简写为 re.X 是 re.compile()函数中的一个可选参数,用于在正则表达式中添加注释。它允许在正则表达式中使用空格、换行符和注释,从而使正则表达式更易于阅读和理解。

例如:

import re

# 匹配电子邮件地址
pattern = re.compile(r'''
    ^                   # 匹配字符串开头
    [\w\.\+\-]+         # 用户名,可以包含字母、数字、点、加号和减号
    @                   # @ 符号
    [\w\.\-]+           # 域名,可以包含字母、数字、点和减号
    \.                  # . 符号
    [a-zA-Z]{2,4}       # 域名后缀,可以是 2 到 4 个字母
    $                   # 匹配字符串结尾
''', re.VERBOSE)

# 测试正则表达式
print(pattern.match('john.doe+test@example.com'))

输出:

<re.Match object; span=(0, 27), match='john.doe+test@example.com'>

re.L

🧾 🧾 语法: re.LOCALE 或简写为 re.L

🧾 🧾 作用: 由当前语言区域决定 \w, \W, \b, \B 和大小写敏感匹配,这个标记只能对byte样式有效,该标记官方已经不推荐使用,因为语言区域机制很不可靠,它一次只能处理一个 "习惯”,而且只对8位字节有效

re.LOCALE 或简写为 re.L 是 re.compile()函数中的一个可选参数,用于启用本地化匹配。它会根据当前系统的本地化设置,对正则表达式中的某些字符类别(如\w、\W、\b、\B)进行本地化处理,从而匹配更广泛的字符集

使用 re.LOCALE 可能会影响正则表达式的行为,因为它取决于系统的本地化设置。因此,如果需要编写可移植的正则表达式,最好不要使用 re.LOCALE。

以下是一个使用 re.LOCALE 的示例:

import re

# 匹配非字母数字字符
pattern = re.compile(r'\W+', re.LOCALE)

# 测试正则表达式
print(pattern.findall('Hello, 你好!'))

输出:

[',', '!']

re.U

🧾 🧾 语法: re.UNICODE 或简写为 re.U

🧾 🧾 作用: 与 ASCII常量类似,匹配unicode编码支持的字符,但是Python3默认字符串已经是Unicode,所以显得有点多余

re.UNICODE 或简写为 re.U 是 re.compile() 函数中的一个可选参数,用于启用 Unicode
匹配模式。它会将正则表达式中的某些字符类别(如 \w、\W、\b、\B)扩展到 Unicode 字符集,从而匹配更广泛的字符集。

在 Python 3 中,默认情况下所有正则表达式都启用了 Unicode 匹配模式,所以在大多数情况下不需要使用 re.UNICODE。

以下是一个使用 re.UNICODE 的示例:

import re

# 匹配非字母数字字符
pattern = re.compile(r'\W+', re.UNICODE)

# 测试正则表达式
print(pattern.findall('Hello, 你好!'))

输出:

[',', '!']

🧾 🧾 理论讲解完毕,结合之前学到的知识和新学到的知识来实战吧!🧾 🧾 !

美某杰实战

1️⃣本次实战目的是使用正则表达式获取红色方框里面的内容并写到csv文档里面
在这里插入图片描述

2️⃣首先我们应该先检查数据是否在链接里面,然后如果在,我们通过链接获取前三页的数据。
在这里插入图片描述

3️⃣确认数据在链接中,复制链接,开始敲代码!!!

import requests
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
}
for i in range(1, 4):
    url = f'https://www.meishij.net/chufang/diy/jiangchangcaipu/?&page={i}'

    html = requests.get(url, headers=headers)


    print(html.text)

运行结果:
在这里插入图片描述
在这里插入图片描述

4️⃣ok,我们可以看见,我们的数据在代码里面,接下来,我们来使用正则表达式来提取数据!!如果还有不会的朋友,可以阅读我之前写的文章。《3.网络爬虫——Requests模块get请求与实战》

5️⃣通过观察元素,我们发现,我们需要的数据在这里面,我们开始找规律,好方便用正则表达式来把数据提取出来!
在这里插入图片描述

6️⃣我们来多看几组数据,好发现规律!
在这里插入图片描述
在这里插入图片描述

7️⃣ 通过观察我们发现,数据都在这里面,请看代码:


<div class="c1"><strong>蛤蜊酿虾滑</strong><span>0 评论  0 人气</span><em>朴朴超市</em></div>
						<div class="c2"><ul><li class="li1">4/ 大概30分钟</li><li class="li2">/ 咸鲜味</li></ul></div>	

<div class="c1"><strong>洋葱焖鸡</strong><span>0 评论  2 人气</span><em>东古美食厨房</em></div>
						<div class="c2"><ul><li class="li1">5/ 大概15分钟</li><li class="li2">/ 家常味</li></ul></div>

<div class="c1"><strong>蒜蓉粉丝蒸鲍鱼</strong><span>0 评论  1 人气</span><em>靓杰</em></div>
						<div class="c2"><ul><li class="li1">11/ 大概60分钟</li><li class="li2">/ 家常味</li></ul></div>

8️⃣这个时候,我们发现代码有空格和换行怎么办?
在这里插入图片描述

9️⃣我们会用到之前讲的\s*来让数据在一行,而不影响正则表达式的使用。

\s*的作用是匹配零个或多个空格字符(包括空格、制表符、换行符等)。它常用于正则表达式中,用于匹配任意数量的空格字符

🔟使用正则表达式来获取数据

'<div class="c1"><strong>(\w+)</strong><span>(.*?)</span><em>(.*?)</em></div>\s*<div class="c2"><ul><li class="li1">(.*?)</li><li class="li2">(.*?)</li></ul></div>',

\w+ 的作用是匹配一个或多个字母、数字或下划线字符。其中,\w 表示匹配任意一个字母、数字或下划线字符,+
表示匹配前面的元素一次或多次。该正则表达式通常用于匹配单词、变量名等含有字母、数字、下划线的字符串。

“.*?” 表示非贪心算法,表示要精确的配对。

作用是匹配任意数量的任意字符,但是会尽可能少地匹配,直到下一个匹配字符出现

“.*”表示贪心算法,表示要尽可能多的匹配

“.”表示匹配任意数量的任意字符,包括空格、制表符、换行符等,且是贪心算法,即尽可能多地匹配字符。这意味着它会匹配尽可能多的字符,直到无法匹配为止。
例如,对于字符串 “abc123def456”,使用正则表达式
“.\d+”,会匹配整个字符串,因为它会尽可能多地匹配字符,直到遇到数字为止。

1️⃣1️⃣完整代码如下:

import re
import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
}


def main(index):
    url = f'https://www.meishij.net/chufang/diy/jiangchangcaipu/?&page={index}'

    html = requests.get(url, headers=headers)

    data = re.findall(
        '<div class="c1"><strong>(\w+)</strong><span>(.*?)</span><em>(.*?)</em></div>\s*<div class="c2"><ul><li class="li1">(.*?)</li><li class="li2">(.*?)</li></ul></div>',
        html.text)

    for i in data:
        print(i)


for i in range(1, 4):
    main(i)

运行结果:

在这里插入图片描述

写入csv文件:

先导入:
在这里插入图片描述

f = open('data.csv', 'w+', encoding='gbk', newline='')
csv_f = csv.writer(f)
csv_f.writerow(['菜名', '信息', '作者', '大概步骤', '类型'])

作用是打开一个名为 data.csv 的文件(如果不存在则创建),并使用 gbk 编码方式进行读写操作,同时设置换行符为
‘\n’。然后创建一个 csv.writer 对象 csv_f,用于将数据写入到文件中。接下来,使用 csv_f.writerow()
方法将包含列名的一行写入到文件中,该行包含了菜名、信息、作者、大概步骤和类型这五个列的名称。这样,文件 data.csv
就具有了一个表格的结构,可以用于存储和处理数据。

然后把这个代码写进去,就得到一个完整的代码:

import csv
import re
import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
}

f = open('data.csv', 'w+', encoding='gbk', newline='')
csv_f = csv.writer(f)
csv_f.writerow(['菜名', '信息', '作者', '大概步骤', '类型'])


def main(index):
    url = f'https://www.meishij.net/chufang/diy/jiangchangcaipu/?&page={index}'

    html = requests.get(url, headers=headers)
    # print(html.text)

    data = re.findall(
        '<div class="c1"><strong>(\w+)</strong><span>(.*?)</span><em>(.*?)</em></div>\s*<div class="c2"><ul><li class="li1">(.*?)</li><li class="li2">(.*?)</li></ul></div>',
        html.text)
    # print(data)
    for i in data:
        csv_f.writerow(i)
        print(i)


for i in range(1, 4):
    main(i)

f.close()

我们来查看一下csv文件:
在这里插入图片描述

🍁 🍁今日学习笔记到此结束,是不是很简单。再次感谢你的阅读,如有疑问或者问题欢迎私信,我会帮忙解决,如果没有回,那我就是在教室上课,抱歉
🍂🍂🍂🍂

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MongoDB 聚合管道的文档操作($sort,$skip,$limit,$sample,$unwind)

目前为止&#xff0c;我们已经介绍了一部分聚合管道中的管道参数&#xff1a; $match&#xff1a;文档过滤 $group&#xff1a;文档分组&#xff0c;并介绍了分组中的常用操作&#xff1a;$addToSet&#xff0c;$avg&#xff0c;$sum&#xff0c;$min&#xff0c;$max等。 $add…

COCO数据集相关知识介绍

&#x1f468;‍&#x1f4bb;个人简介&#xff1a; 深度学习图像领域工作者 &#x1f389;总结链接&#xff1a; 链接中主要是个人工作的总结&#xff0c;每个链接都是一些常用demo&#xff0c;代码直接复制运行即可。包括&#xff1a; &am…

SpringTx 源码解析 - @Transactional 声明式事务执行原理

一、Spring Transactional 声明式事务执行原理 Transactional 是 Spring 框架中用于声明事务的注解&#xff0c;可以标注在方法或类上。当标注在类上时&#xff0c;表示该类的所有public方法都将支持事务。当标注在方法上时&#xff0c;表示该方法将在一个事务内执行。 Trans…

BGP对等体建邻配置

BGP对等体大体分为EBGP对等体和IBGP对等体。而BGP对等体的建邻主要分为两种&#xff1a;1、使用物理接口建邻 2、使用环回借口建邻&#xff0c;针对不同的BGP对等体选用不同的建邻方式。 EBGP的建邻主要使用的是物理接口建邻 IBGP的建邻主要使用的是环回接口建邻 这两种建邻方…

VBA的面向接口编程

工作中有时候会用到VBA&#xff08;Visual Basic for Applications&#xff09;&#xff0c;不是很多&#xff0c;也没有专门去学习VBA&#xff0c;用的时候遇到问题就上网去查资料&#xff0c;解决问题了就放下了。 今天被同事问到VBA中类的用法&#xff0c;我从来没有用过&am…

论文解读:基于 OpenMLDB 的流式特征计算优化

近期&#xff0c;数据库领域的顶级学术会议 ICDE 2023 在迪斯尼主题公园的故乡 - 美国的安纳海姆&#xff08;Anaheim&#xff09;举办。由 OpenMLDB 开源社区和新加坡科技设计大学&#xff08;Singapore University of Technology and Design&#xff09;联合完成的研究工作在…

Vue2-黑马(三)

目录&#xff1a; &#xff08;1&#xff09;vue2-axios &#xff08;2&#xff09;axios-发送请求 &#xff08;3&#xff09;vue2-axios-请求体格式 &#xff08;4&#xff09;vue2-axios-默认配置 &#xff08;1&#xff09;vue2-axios 已经配置了代理&#xff0c;可以…

项目部署---shell脚本自动部署项目

通过shell脚本自动部署项目 操作步骤&#xff1a; 在Linux中安装Git在Linux中安装maven编写shell脚本&#xff08;拉取代码、编译、打包、启动&#xff09;为用户授予执行shell脚本的权限执行shell脚本 执行过程&#xff1a;Linux服务器&#xff08;编译、打包、启动&#x…

每天一道大厂SQL题【Day21】华泰证券真题实战(三)

每天一道大厂SQL题【Day21】华泰证券真题实战(三) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…

爱智EdgerOS之深入解析爱智云原生产品ECSM

一、云原生简介 近些年来&#xff0c;云原生逐渐被业界认可和接受&#xff0c;在国内&#xff0c;包括政府、金融、通信、能源在内的众多领域的大型机构和企业都实现了不同程度的云化&#xff0c;那么什么是云原生呢&#xff1f;云原生计算基金会提供了官方的定义&#xff1a;…

参考|雨水情测报和大坝安全监测系统建设方案

解决方案 小型雨水情测报和大坝安全监测系统解决方案&#xff0c;系统主要由降雨量监测站、水库水位监测站、大坝安全监测中的渗流量、渗流压力和变形监测站及视频和图像监测站等站点组成&#xff0c;同时建立规范、统一的监测平台&#xff0c;集数据传输、信息共享、数据储存…

比较系统的学习 pandas (6)

pandas 数据类型转换 在开始数据分析前&#xff0c;有时需要为数据分配好合适的类型&#xff0c;这样才能 够高效地处理数据 # 对所有字段指定统一类型 data pd.DataFrame(data, dtypefloat32) # 对每个字段分别指定 data pd.read_excel(data.xlsx, dtype{name: string, sc…

CUDA和TensorRT入门

CUDA 官方教程&#xff1a;CUDA C Programming Guide (nvidia.com) 一、基础知识 首先看一下显卡、GPU、和CUDA的关系介绍&#xff1a; 显卡、GPU和CUDA简介_吴一奇的博客-CSDN博客 延迟&#xff1a;一条指令返回的时间间隔&#xff1b; 吞吐量&#xff1a;单位时间内处理…

libwebsockets交叉编译

libwebsockets官网&#xff1a;https://libwebsockets.org/ github&#xff1a;https://github.com/warmcat/libwebsockets 首先下载libwebsockets源码&#xff0c;源码既可以在其官网上下载&#xff0c;也可以到github上下载。这里以v4.1.6为例&#xff0c;https://github.co…

react项目中自定义一个markdown编辑器

Markdown 是一种轻量级标记语言。 Markdown是一种简单的格式化文本的方法&#xff0c;在任何设备上看起来都很棒。它不会做任何花哨的事情&#xff0c;比如改变字体大小、颜色或类型——只是基本的&#xff0c;使用你已经知道的键盘符号。 它还允许人们使用易读易写的纯文本格…

为什么众多大型国企都在升级企业数智化底座?

在数字经济大潮中&#xff0c;数字化转型已不是企业的“选修课”&#xff0c;而是关乎企业生存和长远发展的“必修课”。在企业数字化转型中&#xff0c;国有企业特别是中央企业普遍将数字化转型战略作为“十四五”时期业务规划的重要内容之一&#xff0c;数字化能力也成为衡量…

图文详解CAN Log文件 - ASC文件格式

目录 1 CAN Log文件 -- ASC文件格式 1.1 Header 1.2 版本编号 1.3 经典CAN网络中的描述 1.3.1 经典CAN Standard标准帧的描述 1.3.2 经典CAN Extended扩展帧的描述 1.3.3 CAN Remote远程帧的描述 1.3.4 CAN Error错误帧的描述 1.4 CANFD网络中的描述 1.4.1 经典CAN S…

图解并用 C 语言实现非比较排序(计数排序、桶排序和基数排序)

目录 一、计数排序 二、桶排序 三、基数排序 一、计数排序 算法步骤&#xff1a; 找出待排序数组 arr 中的最小值和最大值&#xff08;分别用 min 和 max 表示&#xff09;。 创建一个长度为 max - min 1、元素初始值全为 0 的计数器数组 count。 扫描一遍原始数组&…

Nacos客户端实例注册源码分析-篇一

Nacos客户端实例注册源码分析-篇一 版本 nacos 服务器端 nacos 2.0.3 实例客户端注册入口 注册案例 回到之前搭建的服务提供者项目 9002 &#xff0c;在真实的生产环境下&#xff0c;如果需要让某一个服务注册到 Nacos 的服务当中&#xff0c;我们引入对应的 nacos 发现依赖&…

4月Google Play政策更新,游戏上架需要注意这几点

3月21日&#xff0c;据路透社报道&#xff0c;由于发现国内某知名电商应用存在恶意软件问题&#xff0c;谷歌已暂时将该APP从商店下架&#xff0c;并表示&#xff1a;将该APP下架是一种安全预防措施&#xff0c;已经下载的用户也会收到警告&#xff0c;提示他们进行卸载。 4月…