解析网页数据并且处理网页正则表达式与re模块

news2024/10/7 8:23:43

目录

一、解析网页数据的技术

1.正则表达式

2.XPath

3.Beautiful Soup

4.JSONPath

二、正则表达式的语法

1.元字符

2.预定义字符集

三、 re 模块的使用

1.创建 Pattern 对象

2.全文匹配


一、解析网页数据的技术

        当服务器成项响应请求返回网页的数据后,我们需要从纷杂的网页数据中提取与目标相
关的数据,这个过程可以理解为解析网页数据。解析网页数据是网络爬虫工作中的关键步骤,
这一步骤主要做的事情是结合网页数据的格式特点,选择合适的技术对整个网页的数据进行
解析,并从中提取出我们最终需要的数据。
        Python 中提供了正则表达式、 Xpath Beautiful Soup JSONPath 等多种解析网页数据的
技术,关于这些技术的介绍如下。

1.正则表达式

        正则表达式是一种文本模式,这种模式描述了匹配字符串的规则,用于检索字符串中是
否有符合该模式的子串,或者对匹配到的子串进行替换。
正则表达式的优点是功能强大、应用广泛;缺点是只适合匹配文本的字面意义,而不适
合匹配文本意义。例如,正则表达式在匹配嵌套了 HTML 代码的文本时,会忽略 HTML 代码
本身存在的层次结构,而将 HTML 代码内容作为普通文本进行搜索。

2.XPath

        XPath 是 XML 路径语言,用于从 HTML XML 格式的数据中提取所需的数据。 XPath
适合用于处理层次结构比较明显的数据,它能够基于 HTML XML 的节点树确定目标节点
所在的路径,顺着这个路径便可以找到文本节点或属性节点。

3.Beautiful Soup

        Beautiful Soup 是一个可以从 HTML XML 文件中提取数据的 Python 库。它同样可以使
XPath 语法提取数据,并且也在此基础上做了方便开发者使用的封装,提供了更多选取节
点的方式。

4.JSONPath

        JSONPath 的用法类似于 XPath ,也是通过表达式的方式解析数据的,但只能解析 JSON
格式的数据。
        综上所述,若要解析纯文本格式的数据,则可以选择正则表达式;若要解析 HTML XML
格式的数据,则可以选择正则表达式、 XPath Beautiful Soup ;若要解析 JSON 格式的数据,
则可以选择 JSONPath
        为方便开发者使用这些技术,Python 提供了一些库或模块进行支持,包括 re lxml bs4
jsonpath 。其中, re 模块支持正则表达式; lxml 库和 bs4 库支持 XPath jsonpath 模块支持
JSONPath bs4 库是 Beautiful Soup 的最新版本,它的全称为 Beautiful Soup 4 。关于这些库或
模块的用法,我们会在后面进行详细介绍。
正则表达式与 re 模块

二、正则表达式的语法

        正则表达式是对字符串操作的一种逻辑公式,它会将事先定义好的一些特定字符及它们的组
合组成一个规则字符串,并且通过这个规则字符串表达对给定字符串的过滤逻辑。
正则表达式的过滤逻辑类似于模糊匹配。例如,字符串的内容为“我爱学习,我爱工作”
时,如果要提取“学习”“工作”,通过正则表达式匹配“我爱”后面的内容就可以找到了。
一条正则表达式也称为一个模式,使用某个模式可以匹配指定文本中与表达式模式相同
的字符串。正则表达式由普通字符、元字符或预定义字符集组成。其中,普通字符包括字母、
数字、符号等,下面分别对元字符和预定义字符集进行介绍。

1.元字符

        在正则表达式中,元字符是指具有特殊含义的专用字符,主要用于规定其前导字符在给
定字符串中出现的模式。常用的元字符如表 4-1 所示。
下面通过列举一些示例来说明表 4-1 中元字符的用法。
  •  J.m:匹配以“J”开始、以“m”结尾的字符串,匹配结果可以为 J#mJimJ2m 等。
  •  ^py:匹配以“py”开始的字符串,匹配结果可以为 pythonpyinstaller 等。
  •  on$:匹配以“on”结尾的字符串,匹配结果可以为 pythonmoon 等。
  •  a|b|c|d:匹配字符串中的“a”“b”“c”或“d”。
  •  [cC]hina:匹配以“c”或“C”开头、以“hina”结尾的字符串,匹配结果可以为 china
  • China
  •  [A-Z]hina:匹配 AZ 的任意一位大写字母,匹配结果可以为 China
  •  June?:匹配元字符“?”前的字符“e0 次或 1 次,匹配结果可以为 june july
  •  ht*p:匹配字符“t0 次或多次,匹配结果可以为 hphtphttphtttp 等。
  •  ht+p:匹配字符“t1 次或多次,匹配结果可以为 htphttphtttp
  •  ht{2}p:匹配字符“t2 次,匹配结果可以为 http
  •  ht{2,4}p:匹配字符“t24 次,匹配结果可以为 httphtttp httttp
  •  Feb(ruary)?:匹配子组“ruary0 次或 1 次,匹配结果可以为 Feb February

2.预定义字符集

        在正则表达式中,除了前面介绍的元字符之外,还预定义了一些字符集。这些字符集以更加
简洁的方式描述了一些由普通字符和元字符组合的模式。常用的预定义字符集如表 4-2 所示。

        例如,使用“\d ”匹配字符串 Regex123 中的任意一个数字,匹配结果为 1 2 3

三、 re 模块的使用

        Python 中提供了 re 模块操作正则表达式,该模块提供了丰富的函数或方法来实现文本匹
配查找、文本替换、文本分割等功能。 re 模块的使用一般可以分为创建 Pattern 对象和全文匹
配两步操作,关于这两步操作的介绍如下。

1.创建 Pattern 对象

        为了节省每次编译正则表达式的开销,保证正则表达式可以重复使用,我们可以使用
compile() 函数对正则表达式进行预编译,从而生成一个代表正则表达式的 Pattern 对象。
complie() 函数的声明如下:
compile(pattern, flags=0)
        上述函数中,参数 pattern 表示一个正则表达式;参数 flags 用于指定正则表达式匹配的模
式。参数 flags 的常用取值及其含义如下。
  •  re.I:忽略大小写。
  •  re.L:做本地化识别(locale-aware)匹配,使预定义字符集\w\W\b\B\s\S
  • 取决于当前区域设定。
  •  re.M:多行匹配,影响“^”和“$”。
  •  re.S:使字符“.”匹配所有字符,包括换行符。
  •  re.U:根据 Unicode 字符集匹配字符。
  •  re.A:根据 ASCII 字符集匹配字符。
  •  re.X:允许使用更灵活的格式(多行、忽略空白字符、加入注释)书写正则表达式。
  • 例如,编写一个用于匹配汉字的正则表达式“[\u4e00-\u9fa5]+”,使用 compile()函数创建
  • 可匹配汉字的 Pattern 对象 regex_obj,具体代码如下。
import re 
# 创建 Pattern 对象
regex_obj = re.compile(r'[\u4e00-\u9fa5]+') 
print(type(regex_obj))
运行代码,输出如下结果。
<class 're.Pattern'>

2.全文匹配

        如果希望从全部文本中匹配所有符合正则表达式的字符串,则可以使用 Pattern 对象的
findall() 函数与 finditer() 函数。其中, findall() 函数用于获取目标文本中所有与正则表达式匹配
的内容,并将所有匹配的内容以列表的形式返回; finditer() 函数同样可以用于获取目标文本中
所有与正则表达式匹配的内容,但会将匹配到的子串以迭代器的形式返回。以 findall() 函数为
例介绍全文匹配, findall() 函数的声明如下。
findall(pattern, string, flags=0)
        上述函数中,参数 pattern 表示一个正则表达式;参数 string 表示待匹配的文本;参数 flags
用于指定正则表达式匹配的模式,该参数的取值与 compile() 函数中 flags 参数的取值相同。
        下面以字符串“狗的英文:dog 。猫的英文: cat 。”为例,使用 findall() 方法匹配该字符串
中所有的汉字,示例代码如下。
import re 
string = "狗的英文:dog。猫的英文:cat。" 
reg_zhn = re.compile(r"[\u4e00-\u9fa5]+") 
print(re.findall(reg_zhn, string))
        在上述代码中,我们首先定义了一个字符串 string ,然后使用 compile() 函数创建了一个
Pattern 对象,用于匹配字符串中的中文字符,最后通过 findall() 函数查找所有符合匹配规则的
子串,并使用 print() 函数输出。
运行代码,输出如下结果。

['狗的英文', '猫的英文']  

 

 

 

 

 

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

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

相关文章

上帝之眼(BEVSee):多相机间无需标定,将各自目标统一到同一坐标系下(代码开源,提供数据集)

Abstract 我们解决了一个新的问题&#xff0c;即在鸟瞰视角&#xff08;BEV&#xff09;中无需预先给定相机校准的多视角相机和目标注册问题。这将多视角目标注册问题提升到一个新的无需校准的阶段&#xff0c;从而极大地缓解了许多实际应用中的限制。然而&#xff0c;这是一个…

深入解析视频编码中的I帧、P帧和B帧

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《音视频》系列专栏&…

【C++进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫

二叉树1&#xff1a;深入理解数据结构第一弹——二叉树&#xff08;1&#xff09;——堆-CSDN博客 二叉树2&#xff1a;深入理解数据结构第三弹——二叉树&#xff08;3&#xff09;——二叉树的基本结构与操作-CSDN博客 二叉树3&#xff1a;深入理解数据结构第三弹——二叉树…

ED01-CMS v20180505 文件上传漏洞(CVE-2022-28525)

前言 CVE-2022-28525 是一个影响 ED01-CMS v20180505 版本的任意文件上传漏洞。该漏洞位于 /admin/users.php?sourceedit_user&id41&#xff0c;攻击者可以利用该漏洞在未经授权的情况下上传任意文件到服务器上&#xff0c;从而可能导致远程代码执行&#xff08;RCE&…

电脑文件自动备份:构建坚不可摧的数据防护网

在数字化浪潮的推动下&#xff0c;电脑已成为我们日常生活和工作中不可或缺的一部分&#xff0c;它承载着海量的个人信息、工作文档、学习资料等重要数据。然而&#xff0c;随着数据量的不断膨胀&#xff0c;数据安全问题也日益严峻。硬盘故障、系统崩溃、病毒攻击、人为误操作…

黑鹰优化算法(BEO)-2024年SCI新算法-公式原理详解与性能测评 Matlab代码免费获取

目录 原理简介 一、种群初始化 二、围捕行为 三、悬停行为 四、捕捉行为 五、抢夺行为 六、警告行为 七、迁徙行为 八、求偶行为 九、孵化行为 性能测评 参考文献 完整代码 黑鹰优化算法(Black eagle optimizer, BEO)是一种新型的元启发式算法&#xff08;智能优化…

Xinstall智能安装页面:一键唤起App,提升用户体验

在移动互联网时代&#xff0c;App已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;随着App数量的不断增加&#xff0c;用户面临着越来越多的选择&#xff0c;如何快速、便捷地安装并打开App成为了用户的一大痛点。针对这一问题&#xff0c;Xinstall凭借其强大的技术实…

深入学习 Kafka(2)- Partition 和 Topic

1. Partition的作用 Topic是逻辑的概念&#xff0c;Partition是物理的概念&#xff1a; Partition 对一个 Topic 的消息进行物理上的分离&#xff0c;让消息可以分布在不同的实体机器上&#xff0c;可以提升系统吞吐量和并行处理能力。每个Partition可以有多个副本&#xff08…

二刷 动态规划

什么是动态规划 Dynamic Programming DP 如果某一问题有很多重叠子问题&#xff0c;使用动态规划时最有效的 动态规划中每一个状态是由上一个状态推导出来的。 动规五部曲 1.确定dp数组以及下标的含义 2.确定递归公式 3.dp数组如何初始化 4.确定遍历顺序 5.举例推导dp数…

软件开发案例参考

前言&#xff1a;基于平台现有需求进行新功能模块开发与实现&#xff0c;以下内容为部分源码解析&#xff0c;仅提供一些思路参考&#xff0c;不予以客观指导&#xff0c;毕竟条条大路通罗马嘛&#xff1b; 语言&#xff1a;C# 工具&#xff1a;visual studio 2017/visual st…

【unity实战】在Unity中使用有限状态机制作一个敌人AI

最终效果 文章目录 最终效果前言有限状态机的主要作用和意义素材下载逻辑图敌人动画配置优雅的代码文件目录状态机代码定义敌人不同状态切换创建敌人效果更多的敌人参考源码完结 前言 有限状态机以前的我嗤之以鼻&#xff0c;现在的我逐帧分析。其实之前我就了解过有限状态机&…

晚上睡觉要不要关路由器?一语中的

前言 前几天小白去了一个朋友家&#xff0c;有朋友说&#xff1a;路由器不关机的话会影响睡眠吗&#xff1f; 这个影响睡眠嘛&#xff0c;确实是会的。毕竟一时冲浪一时爽&#xff0c;一直冲浪一直爽……刷剧刷抖音刷到根本停不下来&#xff0c;肯定影响睡眠。 所以晚上睡觉要…

PCL 点云最小图割(前景、背景点云提取)

点云最小图割 一、概述1.1 概念1.2 算法原理二、代码示例三、运行结果🙋 结果预览 一、概述 1.1 概念 最小图割算法(pcl::MinCutSegmentation):是一种基于图论的对象分割方法,主要用于点云数据的处理和分析。该算法将点云数据表示为一个图结构,其中点云中的点作为图的节…

【SkiaSharp绘图14】SKCanvas方法详解(三)URL注释、按顶点绘制、 是否裁切区域之外、旋转、缩放、倾斜、平移、保存/恢复画布

文章目录 SKCanvas方法DrawUrlAnnotation 绘制URL注释DrawVertices 按顶点绘制Flush 立即绘制QuickReject 判断区域是否在裁切区域之外ResetMatrix重置矩阵Restore、RestoreToCountRotateDegrees按角度旋转画布RotateRadians按弧度旋转画布SaveLayer保存并新建图层Scale 缩放画…

二叉树(2)

二叉树的销毁 分为三个部分的销毁&#xff1a;根节点&#xff0c;左子树和右子树 void TreeDestory(BTNode* root) {if(rootNULL)return;TreeDestory(root->left);TreeDestory(root->right);free(root);rootNULL; }层序遍历&#xff08;上一层带下一层&#xff09; ty…

nginx如何解决惊群效应

什么是惊群效应 惊群效应&#xff08;thundering herd&#xff09;是指多进程&#xff08;多线程&#xff09;在同时阻塞等待同一个事件的时候&#xff08;休眠状态&#xff09;&#xff0c;如果等待的这个事件发生&#xff0c;那么他就会唤醒等待的所有进程&#xff08;或者线…

web权限到系统权限 内网学习第一天 权限提升 使用手工还是cs???msf可以不??

现在开始学习内网的相关的知识了&#xff0c;我们在拿下web权限过后&#xff0c;我们要看自己拿下的是什么权限&#xff0c;可能是普通的用户权限&#xff0c;这个连添加用户都不可以&#xff0c;这个时候我们就要进行权限提升操作了。 权限提升这点与我们后门进行内网渗透是乘…

用AI,每天创作200+优质内容,2分钟教会你操作!

前段时间发布了这篇“寻找爆款文案及标题的9大渠道&#xff0c;直接搬运都能搞流量&#xff01;”&#xff0c;里面我讲到如何寻找爆款标题。最近不少朋友问我&#xff0c;如何创作这个标题相关的内容。 多数平台都有风控规则&#xff0c;有些平台内容也会有字数要求。为了让大…

【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(三)

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知 1.2.1 HTML 与 DOM1.2.2 SVG - 可缩放矢量图形 ✔️ 第一部分第二部分【第三部分】✔️ 1.2.3 Canvas 与 WebGL&#xff08;精译中 ⏳&#xff09;1.2.4 C…

10.8K star!史上最强Web应用防火墙雷池WAF

长亭雷池SafeLine是长亭科技耗时近 10 年倾情打造的WAF(Web Application Firewall)&#xff0c; 一款敢打出口号 “不让黑客越雷池一步” 的 WAF&#xff0c;愿称之为史上最强的一款Web应用防火墙&#xff0c;足够简单、足够好用、足够强的免费且开源的 WAF&#xff0c;基于业…