正则表达式 与 XPath 语法领域细解,初学阶段的你,该怎么学?

举报
梦想橡皮擦 发表于 2021/12/30 11:40:06 2021/12/30
【摘要】 在 Python 爬虫采集领域,正则表达式到底要学多深?同理,XPath 表达式要学多少才够用?这两个问题是很多爬虫新人的疑问,而且这两个问题还没有标准答案……本篇博客为你梳理,在初学爬虫阶段,二者你应该学到何种地步,给你定一个小目标,即初学的范围。 正则表达式正则表达式在 Python 中,主要配合 re 模块使用,该模块应用难度不大,但正则表达式编写却困扰很多朋友。正则难写的原因如下:它...

在 Python 爬虫采集领域,正则表达式到底要学多深?
同理,XPath 表达式要学多少才够用?
这两个问题是很多爬虫新人的疑问,而且这两个问题还没有标准答案……

本篇博客为你梳理,在初学爬虫阶段,二者你应该学到何种地步,给你定一个小目标,即初学的范围。

正则表达式

正则表达式在 Python 中,主要配合 re 模块使用,该模块应用难度不大,但正则表达式编写却困扰很多朋友。

正则难写的原因如下:

  1. 它也算是一门独立的编程语言,有自己的规范;
  2. 正则表达式独立于任何编程语言,也表示它可以和任意编程语言结合;
  3. 每个人写出的表达式不一致,即“每题”的答案都不唯一;
  4. 正则有语法,有修饰符,有元字符,有运算符的优先级,初学阶段概念有点庞杂,无从下手。

既然已经分析到正则难写的原因,那接下来逐一克服即可。

首先要明确第一个概念,正则是干什么的?

简单理解,正则表达式就是一种文本(字符串)的检索模式,它可以从一个长字符串中,匹配出目标字符串。

例如从 abc1234dfertg 中提取 1234

初学正则

初学阶段,上来要做的事情是了解正则的基本语法,从字符开始进行学习。

普通字符
这个是非常简单的,例如 a1 就是一个普通字符,应用到正则表达式里面,就可以去匹配指定字符串的 a 或者 1

顺着字符就扩展出来正则的核心内容了,元字符。

元字符
元字符就是,在正则中有特殊的含义的一些语法表述

常见的元字符如下:

  • \d:匹配一个数字;
  • \w:匹配字母、数字、下划线;

这里就会出现一个学习阶段的门槛,记忆元字符。

在初学阶段,尤其是初学 Python 爬虫采集阶段,那按照如下顺序记忆即可(必须掌握)。

  • .:匹配除换行符(\n、\r)之外的任何单个字符,一般比较简单的正则用 . 能匹配大多数内容了;
  • *:匹配前面的表达式 0 次~无限次;
  • +:匹配前面的表达式 1 次~无限次;
  • ?:匹配前面的子表达式 0 次或 1 次,这个 ? 还有一个用途为【当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的,非贪婪模式表示尽可能少的匹配所搜索的字符串】,这个有点绕,后文有参考案例;
  • \:转义符,例如你想要匹配 .,需要用 \.
  • \s:注意是小写 s,匹配任何空白字符,包括空格、制表符、换页符等等,在解析 HTML 的时候,很常用,因为网页源码中经常出现换行情况;
  • [xyz]:匹配中框好中的任意一个字符;
  • (pattern):分组,并匹配出 pattern;

掌握并熟练的使用以上 8 个元字符,在初学爬虫阶段,一般的网页就能畅通无阻的进行解析了。

解释一下贪婪模式。

如果存在一个字符串为 www.csdn.com,你编写了正则如下:w+,此时能匹配到 www,该正则会尽可能多的去匹配 w 字符,当修改正则为:w+? 时,匹配到的结果为 w,即尽可能少的匹配,也就是 元字符 ? 使得正则变为了非贪婪模式。

初学正则在爬虫中的落地

有了上述元字符概念,你在去复盘爬虫 120 例之前的正则部分文章,会发现出现过很多次如下正则: (.*?),此时就能理解其含义,并且你也能知道,这是最普通的正则表达式,只能算是偷懒之作,但是写起来确实方便。

如果碰到的网页出现了换行或者空格,那上述正则将演变为 (.|\s)*?,结合上文的必背元字符,你能理解其含义吗?

理解不了去学习就对了,毕竟我们又引入了一个元字符 |.|\s 表示选择,匹配 .\s,即匹配任意字符在加上空格。

基本的元字符熟悉之后,才能进行更多的扩展,学习其它元字符,使得你的正则表达式写的标准与高效。

除了元字符外,对于正则还需要学习的是修饰符,该内容不多,有如下几种:

  • i:忽略大小写;
  • g:全局匹配;
  • m:多行匹配;
  • s. 圆点符号,支持匹配空格。

这些内容不重点讲解的原因是:不同的编程语言有其特殊的实现方式,具体需要依旧语言本身来实现,例如 Python 的 re 模块,就有针对性的实现,你可以去检索 re 模块相关用法。

其余进阶内容,请重点围绕正则分组进行学习,该部分将在后期总结篇展现。

XPath 表达式

XPath 即 XML Path,一种在 XML 文档中查找节点元素的语言。

如果深入研究,XPath 依旧有非常多的知识点需要补充,但是作为初学爬虫采集,优先掌握如下内容即可。

初学阶段必会语法

XPath 路径表达式

这个路径与电脑硬盘路径获取基本一致。

先区分好 ///,它们分别表示从根节点选择,或者从任意位置的某个节点进行选择。

例如存在如下 XML 文档,根阶段为 root,其它内容如下所示

<root>
	<book bid="1">
		<author>橡皮擦(擦姐)</author>
	</book>
	<book bid="2">
		<author>橡皮擦(擦哥)</author>
	</book>
</root>

例如 /root/book,表示从根节点开始选择 book 节点,如果使用 /book,则无法匹配到任何数据。

使用 //book,则可以匹配到所有 book 元素。

直接使用 book 也可以匹配出所有的 book 节点。

XPath 测试方法,可以创建一个 HTML 文件,在后在开发者工具中使用 Ctrl+F 换出搜索框,即可测试,如下图所示。

当然浏览器会自动生成 HTML ,HEAD,BODY 节点,正常读取即可。

有了根节点概念之后,就可以类别出 . 表示当前节点,.. 表示当前节点父节点。当然还有 @ 可以选择某个属性,例如下述 XPath 表示提取 book 节点中 bid=1 的节点,语法格式如下:

/html/body/root/book[@bid=1]

提炼一下语法格式如下:

标签名[@属性=‘属性值’]	 # 如果是属性值为数字,去掉双引号也是可以的

如果直接使用 @属性,表示提取具备该属性的节点。

其它选择元素的方法

选择未知元素

在 XPath 中,可以使用 * 选择未知的节点,例如 /book/*/name,表示选择 book 节点下所有节点的 name 节点。

选择谓语

谓语表示查找某个特定的节点,或者包含某个指定的值的节点,谓语嵌套在 [] 中,例如:

选择第一个元素 /root/book[1],选择最后一个元素 /root/book[last()],上文提及的属性选择,也属于谓语的一种用法。

提取属性值或者标签中的文本值

在爬虫采集的时候,经常会用到提取标签的属性值,或者提取标签内部的文本值,提取标签属性值可参考如下案例:/book/@cid,提取标签文本,可参考案例为://book/text()

以上内容即为初学阶段需要掌握的 XPath 相关知识,当然多多益善,有的地方会告诉你可以直接从开发者工具复制 XPath,如下所示:

上述办法复制出来的 XPath 表达式,冗余内容非常多,建议还是自己编写完成。

下述内容为直接复制出的表达式。

/html/body/div[2]/div[5]
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。