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

目录

  • 一、网络爬虫中的正则表达式和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 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网络爬虫

在这里插入图片描述

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

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

相关文章

2411mfc,修改按钮颜色

添加消息:ON_WM_CTLCOLOR() //在OnInitDialog()方法中添加{HWND hSatateWnd GetDlgItem(IDC_CHK)->GetSafeHwnd();SetWindowTheme(hSatateWnd, _T(""), _T(""));}头文件中: afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);HBRUSH O…

python(18) : flask_sqlalchemy 配置sqlserver数据库对象

1.安装依赖 pip3 install flask_sqlalchemy -i https://mirrors.aliyun.com/pypi/simple/ requests2.数据库配置信息(db_manager.py) import osfrom flask import Flask from flask_cors import CORS from flask_sqlalchemy import SQLAlchemydatabase testapp Flask(__nam…

3248. 矩阵中的蛇

3248. 矩阵中的蛇 题目链接&#xff1a;3248. 矩阵中的蛇 代码如下&#xff1a; class Solution { public:int finalPositionOfSnake(int n, vector<string>& commands){int i 0, j 0;for (string& command : commands){if (command "LEFT") { j…

React进阶面试题目(二)

React 组件声明的方法有哪些&#xff1f;各有什么不同&#xff1f; React 组件声明的方法主要有三种&#xff1a; 无状态函数式组件&#xff1a;这种组件只负责根据传入的props来展示&#xff0c;不涉及到state状态的操作。组件不会被实例化&#xff0c;整体渲染性能得到提升…

Day4:生信新手笔记 — R语言简单命令与Rstudio配置

一、Rstudio的界面展示 (很像Matlab风格) 二、Rstudio设置字体大小 三、 用Rproject管理工作目录 工作目录(working directory) 即当前所在的目录&#xff0c;是脚本、图片、文件的默认保存位置&#xff0c;也是文件读取的默认位置。R语言只能和一个文件夹进行互动&#xff0…

IPv6 NA RTR/SOL/OVR标志位,单播多播选择,ndppd代理和kernel配置

NA消息用单播还是多播的判断理由 单播回复&#xff08;Unicast&#xff09;&#xff1a; 如果客户端发送 RS 消息时&#xff0c;使用的是一个全局地址或链路本地地址作为源地址&#xff0c;则 RA 消息会单播回复到客户端的源地址。这种方式减少了网络中的广播流量&#xff0c;…

koa中间件

文章目录 1. koa中间件简介2. 中间件类型1. 应用级中间件2. 路由级中间件3. 错误处理中间件4. 第三方中间件 3.中间件执行流程 1. koa中间件简介 在Koa中&#xff0c;中间件呈现为一个异步函数&#xff0c;该函数支持 async/await 语法&#xff0c;它接收两个参数&#xff1a;…

Nuxt3配置局域网和移动端访问

Nuxt3配置局域网访问 这样配置的好处是&#xff0c;处于开发环境时&#xff0c;同一个局域网的其他伙伴可以通过IP地址端口号访问nuxt项目&#xff0c;方便其他人预览项目效果和进度。 nuxt.config.ts // https://nuxt.com/docs/api/configuration/nuxt-config const isDev …

【开源】A060-基于Spring Boot的游戏交易系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

Go的简单问题问答

基础问题回答 Go 的主要特点是什么&#xff1f; 简洁&#xff1a;语法简化&#xff0c;减少复杂性。并发&#xff1a;内置 Goroutine 和 Channel&#xff0c;支持轻量级并发。静态类型&#xff1a;强类型语言&#xff0c;编译时检查错误。跨平台&#xff1a;编译生成独立的二进…

泷羽sec:shell编程(9)不同脚本的互相调用和重定向操作

声明&#xff1a; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

Pod Pending无法调度

根据您提供的Kubernetes调度警告信息&#xff0c;以下是可能的原因分析&#xff1a; Insufficient Memory: 有1个节点因为内存不足而无法调度Pod。这可能是因为该节点上已经运行的Pod消耗了大量内存&#xff0c;没有足够的资源来运行新的Pod。 Pod Affinity/Anti-Affinity: 有…

QT 左右 上下,拉伸 分配窗口大小

要的效果是以下&#xff1a; QT C 两个QWideget A B现在有放在一个窗口QWideget Test内&#xff0c;初始比例要2&#xff1a;8 ,现在我要 A B 两个窗口中间 当鼠标移到他中间时&#xff0c;有条线&#xff0c;可以左右移动来控件 A B 窗口所占的大小widgetB &#xff08;有 wi…

pyqt6简单应用

from PyQt6.QtWidgets import QWidget,QPushButton,QLineEdit,QLabel,QApplication from PyQt6.QtGui import QPixmap,QIcon,QCursor from PyQt6.QtCore import Qt from PyQt6 import QtCoreimport sysclass Ui_window(QWidget):def __init__(self):super().__init__()# 设置窗…

蓝桥杯每日一题-图书排序

这个题我一开始想着用Map类型&#xff0c;但是发现map类型没办法排序&#xff0c;于是各种尝试之后使用Book类Comparable接口实现了这个功能。 题目链接如下&#xff1a; 图书排序 AC代码如下&#xff1a; import java.util.ArrayList; import java.util.HashMap; import java…

云原生后端:解锁高效可扩展应用的魔法世界

目录 一、云原生后端的崛起&#xff1a;时代的必然选择 二、云原生后端的基石&#xff1a;容器化与 Docker &#xff08;一&#xff09;容器化的概念与优势 &#xff08;二&#xff09;Docker&#xff1a;容器化的明星工具 三、微服务架构&#xff1a;云原生后端的灵魂 &…

【Spring篇】初始Spring MVC框架之Spring MVC入门程序编写

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】【Mybatis篇】【Spring篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f3af;Spring MVC概述 …

下载 M3U8 格式的视频

要下载 M3U8 格式的视频&#xff08;通常是 HLS 视频流&#xff09;&#xff0c;可以尝试以下几种方法&#xff1a; 方法 1&#xff1a;使用下载工具&#xff08;推荐&#xff09; 1. IDM&#xff08;Internet Download Manager&#xff09;&#xff1a; 安装 IDM 并启用浏…

【后端面试总结】Redis过期删除策略

Redis会将每个设置了过期时间的key放入一个独立的字典中&#xff0c;以后会定时遍历这个字典来删除到期的key。除了定时遍历之外&#xff0c;它还会使用惰性策略来删除过期的key。所谓惰性策略就是在客户端访问这个key的时候&#xff0c;Redis对key的过期时间进行检查&#xff…

祖先序列重建结合机器学习改进双键还原酶-文献精读87

Ancestral Sequence Reconstruction Meets Machine Learning: Ene Reductase Thermostabilization Yields Enzymes with Improved Reactivity Profiles 祖先序列重建结合机器学习&#xff1a;酶还原酶热稳定化产生具有改进反应性特征的酶 摘要 烯还原酶&#xff08;EREDs&…