【Python网络爬虫笔记】7-网络爬虫的搜索工具re模块

news2024/12/26 21:44:56

目录

  • 一、网络爬虫中的正则表达式和re模块
    • (一)数据提取的精确性
    • (二)处理复杂的文本结构
    • (三)提高数据处理效率
  • 二、正则表达式的内涵
    • (一)、常用元字符
    • (二)、量词(控制前面的元字符出现的次数)
    • (三)、贪婪匹配和惰性匹配
    • (四)、Python网络爬虫中的常用正则表达式
    • (五)、Python中的re模块
  • 三、典型案例
    • (一). **提取网页中的所有链接**
    • (二). **验证用户输入的电子邮件地址是否合法**
    • (三). **从文本中提取电话号码**

在 Python 中,re模块提供了对正则表达式操作的支持,包括 匹配、搜索、替换、分割等功能,使得在网络爬虫中方便地运用正则表达式来处理抓取到的数据。

一、网络爬虫中的正则表达式和re模块

(一)数据提取的精确性

  1. 定位特定数据
    • 在网页的HTML或其他文本数据中,目标数据往往混杂在大量无关信息中。例如,在一个电影网站上,要提取某部电影的评分,评分数据可能被包裹在特定的HTML标签内。
    • 正则表达式可以精确地定位这些数据。比如,使用<span class="rating_num">(.*?)</span>这个正则表达式,可以在HTML中找到电影评分所在的<span>标签,并提取其中的评分数值。
  2. 过滤无关信息
    • 网络爬虫抓取的网页内容包含大量不需要的信息,如导航栏、广告、版权声明等。正则表达式可以帮助过滤掉这些无关数据。
    • 例如,要从一个包含大量新闻文章的网页中提取正文内容,通过分析网页结构,发现正文内容在<div class="article - content">标签内,可以使用正则表达式<div class="article - content">(.*?)</div>来提取正文,过滤掉其他非正文的HTML元素。

(二)处理复杂的文本结构

  1. 应对多样化的网页结构
    • 不同网站的网页结构各异,甚至同一网站的不同页面可能也有不同的结构。正则表达式具有很强的灵活性,能够适应这种多样性。
    • 例如,在一个电商网站上,商品价格可能在不同页面以不同的HTML格式呈现。有的可能是<span id="price">19.99</span>,有的可能是<div class="product - price">19.99</div>。通过编写灵活的正则表达式,如<(span|div).*?(id="price"|class="product - price")>(.*?)</(span|div)>,可以适应这种结构变化来提取价格信息。
  2. 处理嵌套结构
    • 网页中的HTML标签常常存在嵌套关系,正则表达式可以处理一定程度的嵌套数据提取。
    • 例如,要从一个包含评论列表的网页中提取每条评论及其回复。评论可能在<div class="comment">标签内,回复在<div class="reply">标签内且嵌套在评论标签下。通过合适的正则表达式,可以逐层提取这些嵌套的数据。

(三)提高数据处理效率

  1. 快速匹配
    • 正则表达式引擎经过优化,能够在大量文本中快速找到匹配的模式。在处理大型网页或大量网页时,这种快速匹配能力尤为重要。
    • 例如,在爬取一个包含数千条产品信息的电商网站时,使用正则表达式可以快速扫描每个产品页面,提取诸如产品名称、价格、销量等关键信息,而不需要逐个字符去查找和判断。
  2. 减少代码复杂度
    • 相较于手动编写复杂的字符串处理逻辑,使用正则表达式可以用简洁的模式表达复杂的匹配规则,从而减少代码量和复杂度。
    • 比如,要从一个文本中提取所有的电话号码,手动编写代码可能需要多层循环和条件判断。而使用正则表达式d{3}-d{4}-d{4}(假设电话号码格式为XXX - XXXX - XXXX),可以用很少的代码实现相同的功能。

在Python中,re模块提供了对正则表达式操作的支持,包括匹配、搜索、替换、分割等功能,使得在网络爬虫中方便地运用正则表达式来处理抓取到的数据。

二、正则表达式的内涵

在线正则表达式工具网站:在线正则表达式测试
在这里插入图片描述

正则表达式(Regular Expression)是一种用于描述、匹配和操作文本字符串的强大工具。它由一系列字符和操作符组成,可以定义一个搜索模式,用于在文本中查找、替换或验证符合特定模式的字符串。正则表达式在文本处理、数据验证、搜索引擎、编程语言等多个领域都有广泛应用。

(一)、常用元字符

  1. 普通字符
    • 普通字符本身就匹配自身,例如a匹配字符a5匹配数字5
  2. 特殊元字符
    • .:匹配除换行符以外的任意字符。
    • w:匹配字母或数字或下划线。
    • s:匹配任意的空白符。
    • d:匹配数字。
    • n:匹配一个换行符。
    • t:匹配一个制表符。
    • ^:匹配字符串的开始。
    • $:匹配字符串的结尾。
    • W:匹配非字母或数字或下划线。
    • D:匹配非数字。
    • S:匹配非空白符。
    • a|b:匹配字符a或字符b
    • ( ):匹配括号内的表达式,也表示一个组。
    • [... ]:匹配字符组中的字符。
    • [^... ]:匹配除了字符组中字符的所有字符。

(二)、量词(控制前面的元字符出现的次数)

  1. *:重复零次或更多次。
  2. +:重复一次或更多次。
  3. ?:重复零次或一次。
  4. {n}:重复n次。
  5. {n,}:重复n次或更多次。
  6. {n,m}:重复nm次。

(三)、贪婪匹配和惰性匹配

  1. 贪婪匹配(.*
    • 尽可能多地匹配字符。例如,对于字符串"abcde",模式".*"会匹配整个字符串。
  2. 惰性匹配(.*?
    • 尽可能少地匹配字符。例如,对于字符串"abcde",模式".*?"会匹配空字符串。

(四)、Python网络爬虫中的常用正则表达式

  1. 匹配URL
    • 例如,http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+可以匹配大多数HTTP和HTTPS的URL。
  2. 匹配电子邮件地址
    • 例如,^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$可以匹配标准的电子邮件地址。
  3. 匹配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模块

  1. re.findall(pattern, string)
    • 在字符串string中查找所有符合pattern的子串,并返回一个列表。
    • 例如:
    import re
    lst = re.findall("m", "mai le fen, mai ni mei!")
    print(lst)  # ['m', 'm', 'm']
    
  2. re.search(pattern, string)
    • 在字符串string中查找第一个符合pattern的子串,如果找到则返回一个匹配对象,否则返回None
    • 例如:
    ret = re.search("d", "5点之前,你要给我5000万").group()
    print(ret)  # 5
    
  3. re.match(pattern, string)
    • 从字符串的开头开始匹配,如果开头不符合pattern则返回None
    • 例如:
    ret = re.match("a", "abc").group()
    print(ret)  # a
    
  4. 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 requests

url = "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 re

email = input("请输入你的电子邮件地址:")
if re.match("^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$", email):
    print("电子邮件地址合法!")
else:
    print("电子邮件地址不合法!")

(三). 从文本中提取电话号码

  • 使用合适的正则表达式可以从文本中提取电话号码。
  • 例如:
import re

text = "我的电话号码是13812345678,记得联系我。"
phone_numbers = re.findall("1[3-9]d{9}", text)
print(phone_numbers)  # ['13812345678']

更多爬虫文章见专栏
Python网络爬虫

在这里插入图片描述

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

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

相关文章

42_GAN网络详解(2)---常见的GAN

DCGAN CGAN 条件生成对抗网络&#xff08;Conditional Generative Adversarial Networks, CGAN&#xff09;是生成对抗网络&#xff08;Generative Adversarial Networks, GAN&#xff09;的一种变体&#xff0c;由Mehdi Mirza和Simon Osindero在2014年提出。CGAN的主要改进在…

PC端阅读器--koodo reader

官网&#xff1a;请在必应搜索引擎上输入 koodo reader GitHub&#xff1a;GitHub - koodo-reader/koodo-reader: Windows, macOS, Linux and Web 123云windows版&#xff1a;Koodo-Reader-1.5.1.exe下载 提取码&#xff1a;4455 优&#xff1a; 1.开源&#xff0c;懂&#x…

PyQt设计界面优化 #qss #ui设计 #QMainWindow

思维导图 通过qss实现ui界面设计优化 Qss是Qt程序界面中用来设置控件的背景图片、大小、字体颜色、字体类型、按钮状态变化等属性&#xff0c;它是用来美化UI界面。实现界面和程序的分离&#xff0c;快速切换界面。 首先我们在Pytchram创建一个新目录 然后将我们所需要的图片打…

多维数组及其应用————13

1. 二维数组 如果我们把 ⼀维数组做为数组的元 素&#xff0c;这时候就是⼆维数组&#xff0c; ⼆维数组作为数组元素的数组被为三维数组&#xff0c;⼆维数组以上的数组统称 为多维数组。 1.1 二维数组的创建 先行后列 其实也可以这样理解&#xff1a;把二维数组当成特殊的一维…

基于Java Springboot校园导航微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse微信开发…

k8s,声明式API对象理解

命令式API 比如&#xff1a; 先kubectl create&#xff0c;再replace的操作&#xff0c;我们称为命令式配置文件操作 kubectl replace的执行过程&#xff0c;是使用新的YAML文件中的API对象&#xff0c;替换原有的API对象&#xff1b;而kubectl apply&#xff0c;则是执行了一…

【北京迅为】iTOP-4412全能版使用手册-第三十五章 WEB控制LED

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

轻量的基于图结构的RAG方案LightRAG

LightRAG出自2024年10月的论文《LIGHTRAG: SIMPLE AND FASTRETRIEVAL-AUGMENTED GENERATION》(github)&#xff0c;也是使用图结构来索引和搜索相关文本。 LightRAG作者认为已有的RAG系统有如下两个限制&#xff0c;导致难以回答类似"How does the rise of electric vehi…

分布式cap

P&#xff08;分区安全&#xff09;都能保证&#xff0c;就是在C&#xff08;强一致&#xff09;和A&#xff08;性能&#xff09;之间做取舍。 &#xff08;即立马做主从同步&#xff0c;还是先返回写入结果等会再做主从同步。类似的还有&#xff0c;缓存和db之间的同步。&am…

AD7606使用方法

AD7606是一款8通道最高16位200ksps的AD采样芯片。5V单模拟电源供电&#xff0c;真双极性模拟输入可以选择10 V&#xff0c;5 V两种量程。支持串口与并口两种读取方式。 硬件连接方式&#xff1a; 配置引脚 引脚功能 详细说明 OS2 OS1 OS2 过采样率配置 000 1倍过采样率 …

[VUE]框架网页开发02-如何打包Vue.js框架网页并在服务器中通过Tomcat启动

在现代Web开发中&#xff0c;Vue.js已经成为前端开发的热门选择之一。然而&#xff0c;将Vue.js项目打包并部署到生产环境可能会让一些开发者感到困惑。本文将详细介绍如何将Vue.js项目打包&#xff0c;并通过Tomcat服务器启动运行。 1. 准备工作 确保你的项目能够正常运行,项…

服务器与普通电脑有什么区别?

服务器和普通电脑&#xff08;通常指的是个人计算机&#xff0c;即PC&#xff09;有众多相似之处&#xff0c;主要构成包含&#xff1a;CPU&#xff0c;内存&#xff0c;芯片&#xff0c;I/O总线设备&#xff0c;电源&#xff0c;机箱及操作系统软件等&#xff0c;鉴于使用要求…

2.2 线性表的顺序表示

2.2.1 顺序表的定义 一、顺序表的基本概念 线性表的顺序存储又称顺序表。 它是用一组地址连续的存储单元依次存储线性表中的数据元素&#xff0c;从而使得逻辑上相邻的连个元素在物理上也相邻。 第1个元素存储在顺序表的起始位置&#xff0c;第i个元素存储位置后面紧接着存…

游戏引擎学习第30天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 在这段讨论中&#xff0c;重点是对开发过程中出现的游戏代码进行梳理和进一步优化的过程。 工作回顾&#xff1a;在第30天&#xff0c;回顾了前一天的工作&#xff0c;并提到今天的任务是继续从第29天的代码开始&#xff0c…

探索HarmonyOS:一键掌握Router与NavPathStatck的传参和页面回调技巧

路由的选择 HarmonyOS提供两种路由实现的方式&#xff0c;分别是 Router 和 NavPatchStack。两者使用场景和特效各有优劣。 组件适用场景特点备注Router模块间与模块内页面切换通过每个页面的url实现模块间解耦NavPathStack模块内页面切换通过组件级路由统一路由管理 什么时候使…

每日计划-1203

1. 完成 236. 二叉树的最近公共祖先 ​ /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution {public:TreeNode* lowe…

【AI系统】Auto-Tuning 原理

Auto-Tuning 原理 在硬件平台驱动算子运行需要使用各种优化方式来提高性能&#xff0c;然而传统的手工编写算子库面临各种窘境&#xff0c;衍生出了自动生成高性能算子的的方式&#xff0c;称为自动调优。在本文我们首先分析传统算子库面临的挑战&#xff0c;之后介绍基于 TVM…

多组学数据如何发表高分SCI论文,以RNA-Seq数据为例

随着高通量测序以及生物信息学的发展&#xff0c;R语言在生物大数据分析以及数据挖掘中发挥着越来越重要的作用。想要成为一名优秀的生物数据分析者与科研团队不可或缺的人才&#xff0c;除了掌握对生物大数据挖掘与分析技能之外&#xff0c;还要具备一定的统计分析能力与SCI论…

攻防世界-easyupload-新手训练区域

赛前回顾 1.文件上传绕过方式 1.mime&#xff1a;可以通过关闭浏览器js&#xff0c;浏览器f12切断点&#xff0c;burp抓包该文件类型来绕过 2.双写php绕过pphphp或者phpphp 3.使用ptml来绕过&#xff0c;phtml也是通过php来解析的 4..htaccess绕过&#xff0c;这个是apache的解…

位图的学习

一&#xff0c;位图介绍 位图&#xff08;Bitmap&#xff09;是一种用于存储图像的方式&#xff0c;它通过二维矩阵&#xff08;由像素组成&#xff09;来表示图像的每一个细节。每个像素通常对应一个特定的颜色值&#xff0c;位图的每个“位”就代表了图像的一个像素。 位图…