【Python网络爬虫笔记】7-网络爬虫的搜索工具re模块
目录
- 一、网络爬虫中的正则表达式和re模块
- (一)数据提取的精确性
- (二)处理复杂的文本结构
- (三)提高数据处理效率
- 二、正则表达式的内涵
- (一)、常用元字符
- (二)、量词(控制前面的元字符出现的次数)
- (三)、贪婪匹配和惰性匹配
- (四)、Python网络爬虫中的常用正则表达式
- (五)、Python中的re模块
- 三、典型案例
- (一). **提取网页中的所有链接**
- (二). **验证用户输入的电子邮件地址是否合法**
- (三). **从文本中提取电话号码**
在 Python 中,re模块提供了对正则表达式操作的支持,包括 匹配、搜索、替换、分割等功能,使得在网络爬虫中方便地运用正则表达式来处理抓取到的数据。
一、网络爬虫中的正则表达式和re模块
(一)数据提取的精确性
- 定位特定数据
- 在网页的HTML或其他文本数据中,目标数据往往混杂在大量无关信息中。例如,在一个电影网站上,要提取某部电影的评分,评分数据可能被包裹在特定的HTML标签内。
- 正则表达式可以精确地定位这些数据。比如,使用
<span class="rating_num">(.*?)</span>这个正则表达式,可以在HTML中找到电影评分所在的<span>标签,并提取其中的评分数值。
- 过滤无关信息
- 网络爬虫抓取的网页内容包含大量不需要的信息,如导航栏、广告、版权声明等。正则表达式可以帮助过滤掉这些无关数据。
- 例如,要从一个包含大量新闻文章的网页中提取正文内容,通过分析网页结构,发现正文内容在
<div class="article - content">标签内,可以使用正则表达式<div class="article - content">(.*?)</div>来提取正文,过滤掉其他非正文的HTML元素。
(二)处理复杂的文本结构
- 应对多样化的网页结构
- 不同网站的网页结构各异,甚至同一网站的不同页面可能也有不同的结构。正则表达式具有很强的灵活性,能够适应这种多样性。
- 例如,在一个电商网站上,商品价格可能在不同页面以不同的HTML格式呈现。有的可能是
<span id="price">19.99</span>,有的可能是<div class="product - price">19.99</div>。通过编写灵活的正则表达式,如<(span|div).*?(id="price"|class="product - price")>(.*?)</(span|div)>,可以适应这种结构变化来提取价格信息。
- 处理嵌套结构
- 网页中的HTML标签常常存在嵌套关系,正则表达式可以处理一定程度的嵌套数据提取。
- 例如,要从一个包含评论列表的网页中提取每条评论及其回复。评论可能在
<div class="comment">标签内,回复在<div class="reply">标签内且嵌套在评论标签下。通过合适的正则表达式,可以逐层提取这些嵌套的数据。
(三)提高数据处理效率
- 快速匹配
- 正则表达式引擎经过优化,能够在大量文本中快速找到匹配的模式。在处理大型网页或大量网页时,这种快速匹配能力尤为重要。
- 例如,在爬取一个包含数千条产品信息的电商网站时,使用正则表达式可以快速扫描每个产品页面,提取诸如产品名称、价格、销量等关键信息,而不需要逐个字符去查找和判断。
- 减少代码复杂度
- 相较于手动编写复杂的字符串处理逻辑,使用正则表达式可以用简洁的模式表达复杂的匹配规则,从而减少代码量和复杂度。
- 比如,要从一个文本中提取所有的电话号码,手动编写代码可能需要多层循环和条件判断。而使用正则表达式
d{3}-d{4}-d{4}(假设电话号码格式为XXX - XXXX - XXXX),可以用很少的代码实现相同的功能。
在Python中,re模块提供了对正则表达式操作的支持,包括匹配、搜索、替换、分割等功能,使得在网络爬虫中方便地运用正则表达式来处理抓取到的数据。
二、正则表达式的内涵
在线正则表达式工具网站:在线正则表达式测试

正则表达式(Regular Expression)是一种用于描述、匹配和操作文本字符串的强大工具。它由一系列字符和操作符组成,可以定义一个搜索模式,用于在文本中查找、替换或验证符合特定模式的字符串。正则表达式在文本处理、数据验证、搜索引擎、编程语言等多个领域都有广泛应用。
(一)、常用元字符
- 普通字符
- 普通字符本身就匹配自身,例如
a匹配字符a,5匹配数字5。
- 普通字符本身就匹配自身,例如
- 特殊元字符
.:匹配除换行符以外的任意字符。w:匹配字母或数字或下划线。s:匹配任意的空白符。d:匹配数字。n:匹配一个换行符。t:匹配一个制表符。^:匹配字符串的开始。$:匹配字符串的结尾。W:匹配非字母或数字或下划线。D:匹配非数字。S:匹配非空白符。a|b:匹配字符a或字符b。( ):匹配括号内的表达式,也表示一个组。[... ]:匹配字符组中的字符。[^... ]:匹配除了字符组中字符的所有字符。
(二)、量词(控制前面的元字符出现的次数)
*:重复零次或更多次。+:重复一次或更多次。?:重复零次或一次。{n}:重复n次。{n,}:重复n次或更多次。{n,m}:重复n到m次。
(三)、贪婪匹配和惰性匹配
- 贪婪匹配(
.*)- 尽可能多地匹配字符。例如,对于字符串
"abcde",模式".*"会匹配整个字符串。
- 尽可能多地匹配字符。例如,对于字符串
- 惰性匹配(
.*?)- 尽可能少地匹配字符。例如,对于字符串
"abcde",模式".*?"会匹配空字符串。
- 尽可能少地匹配字符。例如,对于字符串
(四)、Python网络爬虫中的常用正则表达式
- 匹配URL
- 例如,
http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+可以匹配大多数HTTP和HTTPS的URL。
- 例如,
- 匹配电子邮件地址
- 例如,
^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$可以匹配标准的电子邮件地址。
- 例如,
- 匹配IP地址
- 例如,
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$可以匹配IPv4地址。
- 例如,
(五)、Python中的re模块
re.findall(pattern, string)- 在字符串
string中查找所有符合pattern的子串,并返回一个列表。 - 例如:
import re lst = re.findall("m", "mai le fen, mai ni mei!") print(lst) # ['m', 'm', 'm']- 在字符串
re.search(pattern, string)- 在字符串
string中查找第一个符合pattern的子串,如果找到则返回一个匹配对象,否则返回None。 - 例如:
ret = re.search("d", "5点之前,你要给我5000万").group() print(ret) # 5- 在字符串
re.match(pattern, string)- 从字符串的开头开始匹配,如果开头不符合
pattern则返回None。 - 例如:
ret = re.match("a", "abc").group() print(ret) # a- 从字符串的开头开始匹配,如果开头不符合
re.finditer(pattern, string)- 在字符串
string中查找所有符合pattern的子串,并返回一个迭代器。 - 例如:
it = re.finditer("m", "mai le fen, mai ni mei!") for match in it:print(match.group())- 在字符串
三、典型案例
(一). 提取网页中的所有链接
- 使用
re.findall和匹配URL的正则表达式可以从网页源代码中提取所有链接。 - 例如:
import re
import requestsurl = "https://www.example.com"
response = requests.get(url)
links = re.findall("http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+", response.text)
print(links)
(二). 验证用户输入的电子邮件地址是否合法
- 使用匹配电子邮件地址的正则表达式可以验证用户输入。
- 例如:
import reemail = input("请输入你的电子邮件地址:")
if re.match("^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$", email):print("电子邮件地址合法!")
else:print("电子邮件地址不合法!")
(三). 从文本中提取电话号码
- 使用合适的正则表达式可以从文本中提取电话号码。
- 例如:
import retext = "我的电话号码是13812345678,记得联系我。"
phone_numbers = re.findall("1[3-9]d{9}", text)
print(phone_numbers) # ['13812345678']
更多爬虫文章见专栏
Python网络爬虫

相关文章:
【Python网络爬虫笔记】7-网络爬虫的搜索工具re模块
目录 一、网络爬虫中的正则表达式和re模块(一)数据提取的精确性(二)处理复杂的文本结构(三)提高数据处理效率 二、正则表达式的内涵(一)、常用元字符(二)、量…...
为什么选择 React Native 作为跨端方案
为什么选择 React Native 作为跨端方案 我深刻地知道,没有完美的跨端技术,只有适合的场景。脱离适用场景去谈跨端技术没有什么意义。 适用场景 1. 业务更新迭代较快的团队与出海团队 React Native 特别适合那些业务更新频繁、需要快速响应市场的团队…...
服务器与普通电脑有什么区别?
服务器和普通电脑(通常指的是个人计算机,即PC)有众多相似之处,主要构成包含:CPU,内存,芯片,I/O总线设备,电源,机箱及操作系统软件等,鉴于使用要求…...
Oracle 12c Data Guard 环境中的 GAP 修复方法
概述 上文中提到Oracle 12c 引入了多项新技术来简化 Data Guard 环境中的 GAP 修复过程,如(RECOVER … FROM SERVICE)。这些新特性不仅减少了操作步骤,还提高了效率和准确性。本文档将详细说明如何利用这些新特性进行 GAP 修复。…...
力扣 三角dp
动态规划基础题,当前所在元素来自上一行的两列的值。 题目 从图可以看出,每一行的第一个数与最后一个数都是1,然后中间的数是来自它左上方和右上方的数的和。当然并不是要打印这个三角形的形状,因此可以想到正常的打印方式应该是…...
SQL基础语法全解析(上篇)
一、基本概念 1. 数据库术语 数据库(database) - 保存有组织的数据的容器(通常是一个文件或一组文件)。数据表(table) - 某种特定类型数据的结构化清单。模式(schema) - 关于数据库…...
【笔记】Linux服务器端使用百度网盘
1、在python环境下,下载bypy pip install bypy 2、第一次连接需要认证 bypy info 认证通过后百度网盘会出现bypy文件夹,如下 3、查看当前文件夹下的文件 bypy list 若有很多文件夹,可在后面增加文件夹名称,列出对应位置下的文件&a…...
UEFI Spec 学习笔记---3 - Boot Manager(3)
3.2 Boot Manager Policy Protocol EFI_BOOT_MANAGER_POLICY_PROTOCOL----EFI应用程序使用该协议请求UEFI引导管理器使用平台策略连接设备。 typedef struct _EFI_BOOT_MANAGER_POLICY_PROTOCOL EFI_BOOT_MANAGER_POLICY_PROTOCOL; struct _EFI_BOOT_MANAGER_POLICY_PROTOCOL…...
ATTCK红队评估实战靶场(四)
靶机链接:http://vulnstack.qiyuanxuetang.net/vuln/detail/6/ 环境搭建 新建两张仅主机网卡,一张192.168.183.0网段(内网网卡),一张192.168.157.0网段(模拟外网网段),然后按照拓补…...
Android Studio 历史版本下载
Android Studio 历史版本下载 官方链接:https://developer.android.google.cn/studio/archive 通过gradle插件版本反查Android Studio历史版本 Android Studio Ladybug | 2024.2.1 October 1, 2024 【https://redirector.gvt1.com/edgedl/android/studio/ide-zip…...
微信小程序px和rpx单位互转方法
js代码如下 Page({data: {width: 0,width2: 0},onLoad: function (options) {let px this.pxToRpx(380)let rpx this.rpxToPx(730.7692307692307) // 检查两个互转是否是相同即可,例如pxToRpx(380)转成730.7692307692307 则rpxToPx(730.7692307692307)如果是380则代表互转没…...
Vercel 部署与管理指南:简化前端应用的自动化部署流程
引言 在现代的前端开发中,部署和托管项目一直是开发者关注的重要环节。Vercel,作为一个专注于简化前端开发和部署的平台,凭借其强大的自动化功能、全球内容分发网络(CDN)以及对 Next.js 等框架的优越支持,…...
Java11使用JVM同一日志框架启用日志记录
你可以使用-Xlog选项配置或启用Java虚拟机同一日志框架的日志记录。 -Xlog:gc*trace:file/Users/xx/gc-%t.log:time,tags,level,pid,tid,hostname,path:filecount3,filesize10K -Xlog:gc*trace:stdout:time,tags,level,pid,tid,hostname:filecount3,filesize10K -Xlog:gc*trac…...
onlyoffice实现文档比对(Beta版)-纯文字比对(非OCR)
一、说明 文档比对光靠前端或者后端是无法实现的。 该文中的实现方案为:onlyofficejava。java进行文档差异化比较并输出对比结果,only进行得到结果处理渲染。 此方案目前为Beta版本,简单Word Demo实现了比对结果。css、关联动态效果登将在后期…...
JS querySelector方法的优点
1. 灵活性 支持所有 CSS 选择器 ID 选择器:#id 示例:document.querySelector(#myId)解释:选择 id 为 myId 的元素。类选择器:.class 示例:document.querySelector(.myClass)解释:选择具有 class 为 myCla…...
利用获取商品详情API:item_get可以获取到淘宝商品详情的哪些数据?
先来看下测试的返回数据吧 items: { total_results: 76, totalpage: 8, page_size: 10, page: "1", item: [ { rate_content: "和我家的鞋柜特别搭,加上这一条遮挡布,感觉整洁多了,布料不是硬邦邦的那种,很满意。…...
【大数据学习 | 面经】Spark 3.x 中的AQE(自适应查询执行)
Spark 3.x 中的自适应查询执行(Adaptive Query Execution,简称 AQE)通过多种方式提升性能,主要包括以下几个方面: 动态合并 Shuffle 分区(Coalescing Post Shuffle Partitions): 当 …...
[Vue]Vue-router
路由 对前端路由的理解 在前端技术早期,一个 url 对应一个页面,如果要从 A 页面切换到 B 页面,那么必然伴随着页面的刷新。这个体验并不好,不过在最初也是无奈之举——用户只有在刷新页面的情况下,才可以重新去请求数…...
【HarmonyOS】鸿蒙应用使用lottie动画
【HarmonyOS】鸿蒙应用使用lottie动画 一、lottie动画是什么? https://airbnb.design/lottie Lottie是由Airbnb团队开发的一个适用于iOS、Android、React Native、Web和Windows的开源动画库,用于解析使用Bodymovin导出为JSON的Adobe After Effects动…...
1.使用docker 部署redis Cluster模式 集群3主3从
1.使用docker 部署redis Cluster模式 集群3主3从 1.1 先安装docker 启动docker服务,拉取redis镜像 3主3从我们要在docker启动6个容器docker run --name redis-node-1 --net host --privilegedtrue -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
Qwen系列之Qwen3解读:最强开源模型的细节拆解
文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...
