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

目录

一、解析网页数据的技术

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() 函数输出。
运行代码,输出如下结果。

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

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

libreoffice报: error while loading shared libraries: libcups.so.2: cannot

切换到cd /opt/libreoffice7.1/programlibreoffice查看版本的时候报:/opt/libreoffice7.1/program/soffice.bin: error while loading shared libraries: libcups.so.2: cannot open shared object file: No such file or directory ./soffice --version解决办法&#xff1a; …

MySQL之复制(六)

复制 复制拓扑 拥有备库的主-主结构 另外一种相关的配置是为每个主库增加一个备库&#xff0c;如图所示。这种配置的优点是增加了冗余&#xff0c;对于不同地理位置的复制拓扑&#xff0c;能够消除站点单点失效的问题。你也可以像平常一样&#xff0c;将读查询分配到备库上。…

深入JVM:详解JIT即时编译器

文章目录 深入JVM&#xff1a;详解JIT即时编译器一、序言二、基础概念1、何为JIT即时编译2、热点代码 三、HotSpot内置的即时编译器1、C1编译器2、C2编译器3、分层编译3.1 协作流程 四、常见JIT优化技术1、方法内联2、逃逸分析&#xff08;1&#xff09;同步锁消除&#xff08;…

从零开始学习Linux(10)----动静态库

目录 1.制作静态库 1.编写源代码 2.编译 3.打包库 4.使用库 2.制作动态库 1.编译 2.打包库 3.总结 3.理解动态库加载 1.站在系统角度理解 2.谈谈编址&#xff0c;可执行程序 1.制作静态库 1.编写源代码 假设你编写了两个源代码文件mymath.c和myprintf.c以及它们对应…

vuex的actions返回结果类型是promise及actions方法互相调用

this.$store.dispatch(‘logout’)返回的结果是Promise类型的 调用成功的情况下&#xff0c;返回状态为fulfilled&#xff0c;值为undefined。 所以可以直接进行.then操作&#xff1a; this.$store.dispatch(logout).then((result) > {console.log(result); });因为 Vuex …

正则表达式;grep、sed、awk、soft、uniq、tr 详解

正则表达式 概念 正则表达式&#xff08;Regular Expression&#xff0c;常简写为regex、regexp或RE&#xff09;是一种强大的文本处理工具&#xff0c;它使用一种特殊的字符序列来帮助用户检查一个字符串是否与某种模式匹配。 标准正则表达式 首先安装正则表达式pcre库 创…

草莓不是莓,西瓜才是莓——解读 Kubernetes 中被驱逐的 Pod

每天都有成千上万的 Pod 从节点中被驱逐。它们无家可归、困惑不已&#xff0c;不得不放弃之前的生活方式。其中一些甚至变成无节点状态。 在 Kubernetes 中 Pod 被驱逐意味着什么&#xff1f;我们常常能看到 Pod 因为资源不足被终止。但为什么会发生这种情况呢&#xff1f; 驱…

ChatGPT API技术教程OpenAI APIKey在线对接-Chat Completion对象

表示模型根据提供的输入返回的聊天完成响应。 {"id": "chatcmpl-123","object": "chat.completion","created": 1677652288,"model": "gpt-3.5-turbo-0125","system_fingerprint": "fp…

ElementUI组件库,分页组件靠右显示

ElementUI组件库&#xff0c;分页组件靠右显示 分页组件 &#xff0c;el-pagination组件默认靠左显示&#xff0c;靠右显示的话只需给layout添加一个“->”属性值即可, 看图

AMEYA360代理品牌江苏润石:RS8661/2/4系列高压精密低噪声运算放大器

继RS8651/2/4系列高压精密低噪声运算放大器成功推向市场&#xff0c;润石科技再次成功量产RS8661/2/4系列高压精密低噪声运算放大器。 RS8661/2/4系列产品将工作电压提升到最高36V(18V)、失调电压进一步优化到5μV、在工业现场数据采集、各种仪器仪表测量设备\分析设备上有着广…

IDEA services模块无法启动springboot服务(添加了springboot但是为空白)

https://blog.csdn.net/m0_54042402/article/details/117918995 https://blog.csdn.net/qq_46550964/article/details/122235235 Alt8 显示services模块 发现有springboot启动模块&#xff0c;点一下springboot之后&#xff0c;这个模块就消失了 会自动在.idea文件夹下的work…

选专业填志愿,家庭经济条件是必须考虑因素

对比过去&#xff0c;大部分家庭的物质条件已经好很多了&#xff0c;但也有一部分家庭条件较为困难&#xff0c;对于家庭条件较为困难的高考学生而言&#xff0c;高考志愿填报需要考虑的因素更多&#xff0c;因为自己就读的专业&#xff0c;绝对不能是自己的家庭无法负担的专业…

数值分析笔记(三)函数逼近

最佳平方逼近 函数逼近是使用一种简单易算的函数来近似表示一个复杂函数。 该问题可转化为求解线性方程组 G n C F n ​ G_{n}CF_{n}​ Gn​CFn​​ 其中&#xff0c;系数 C ( c 0 , c 1 , ⋯ , c n ) T , F n ( ( f , φ 0 ) , ( f , φ 1 ) , ⋯ , ( f , φ n ) ) T C(c…

Java网络编程之UDP通信与TCP通信交互代码实现

​import java.net.InetAddress; import java.io.IOException; class Main {public static void main(String[] args) {try { InetAddress localAddress InetAddress.getLocalHost(); //获得本地主机 InetAddress remoteAddress InetAddress.getByName("www.itcast.cn&qu…

非强化学习的对齐方法

在文章《LLM对齐“3H原则”》和《深入理解RLHF技术》中&#xff0c;我们介绍了大语言模型与人类对齐的“3H原则”&#xff0c;以及基于人类反馈的强化学习方法&#xff08;RLHF&#xff09;&#xff0c;本文将继续介绍另外一种非强化学习的对齐方法&#xff1a;直接偏好优化&am…

【Java】解决Java报错:IllegalMonitorStateException in Synchronization

文章目录 引言一、IllegalMonitorStateException的定义与概述1. 什么是IllegalMonitorStateException&#xff1f;2. IllegalMonitorStateException的常见触发场景3. 示例代码 二、解决方案1. 确保在同步代码块或方法中调用wait()、notify()和notifyAll()2. 使用同步方法3. 使用…

鸿蒙开发系统基础能力:【@ohos.inputMethod (输入法框架)】

输入法框架 说明&#xff1a; 本模块首批接口从API version 6开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import inputMethod from ohos.inputMethod;inputMethod8 常量值。 系统能力&#xff1a;以下各项对应的系统能力均为Sy…

NetSuite Account Merge 科目合并功能分析

最近项目中&#xff0c;客户有提到过能否将不用的Account与新建的Account进行合并&#xff0c;即我们所说的Merge功能&#xff5e;可以&#xff0c;但是该功能有使用的限制&#xff0c;比如最直接的一点需要注意&#xff0c;不同类型的Account是不可以使用Merge功能的&#xff…

Linux系统学习——指令三

Linux系统学习——指令三 Linux系统学习——指令三chmod — 文件执行权限添加文件执行权限去除文件执行权限 查找文件中特定关键字使用vi编辑文件并查找特定关键字文本文件查找特定关键字1: 使用 grep 命令2: 使用 find 命令3: 使用 awk 命令4: 使用 sed 命令5: 使用 ag 命令&a…

一文2000字记录基于jmeter+perfmon的稳定性测试

01、任务情况 1、任务总览 本次平台稳定性测试的目的在于&#xff1a;在服务器压力处于较饱和&#xff08;达到80%系统最大TPS&#xff09;压力之下&#xff0c;在较长时间&#xff08;>8小时&#xff09;之内观测服务器稳定性问题&#xff0c;以及资源使用情况和异常。 …