网络爬虫中Xpath的使用方法

正则表达式虽然可以处理包含了诸如 HTML 或 XML 内容的字符串,但只能根据文本的
特征匹配字符串,而忽略字符串所包含的内容的真实格式。为了解决这个问题,Python 引入
XPath 以及支持 XPath 的第三方库 lxml,专门对 XML 或 HTML 格式的数据进行解析。接下来,
本节将针对 XPath 和 lxml 的相关内容进行详细介绍。

一、XPath 简介

XPath 即 XML 路径查询语言(XML Path Language),是一种用于确定 XML 文档中部分
节点位置的语言。它起初只支持搜索 XML 文档,更新后能支持搜索 HTML 文档。截至完稿
时,XPath 的最新版本为 XPath3.1。
那么 XPath 是如何搜索 XML 或 HTML 文档呢?其实 XPath 基于 XML 或 HTML 的节点
树,沿着节点树的节点关系定位到目标节点所在的位置,并选取节点或节点集。为了形象地
描述出搜索节点的路径,XPath 提供了简洁明了的路径表达式,通过路径表达式可以快速地定
位与选取 XML 或 HTML 文档中的一个节点或者一组节点集。
与正则表达式相比,路径表达式的搜索方式大不相同。在这里,我们借用一个形象的例
子进行比较。假如我们把选取目标节点比作找金燕龙办公楼。如果我们通过正则表达式查找,
则正则表达式会告诉我们办公楼有哪些特征,办公楼的左边有哪些建筑、右边有哪些建筑。
这样的描述限定的查找范围比较宽泛,查找起来比较烦琐。如果我们通过路径表达式查找,
则路径表达式会直接告诉我们办公楼的具体位置,即中国北京市昌平区建材城西路金燕龙办
公楼。这样的描述更加精准、更易查找。
路径表达式描述了从一个节点到另一个节点或一组节点的路径。这些路径与在常规的计算
机文件系统中见到的路径非常相似。例如,“/学生名单/班级/学生/籍贯”就是一个路径表达式,
该路径表达式也是用“/”字符进行分隔的,只不过它分隔的是节点,而不是目录。接下来,通
过一张示意图来描述 XML 文档、XML 节点树与路径表达式的关系,具体如图 4-1 所示。
422ec9dbdf0e41b0bf9788283e37e4ec.png
在图 4-1 中,从左到右、从上到下依次为 XML 文档、XML 节点树和路径表达式。其中,
路径表达式为“/bookstore/book/price”,它对应的路径为 XML 节点树中加粗的线条,用于选
取节点<price>对应的文本 39.95。

二、XPath 语法

我们如果要编写一个路径表达式,则要先了解 XPath 的语法,如此才能使用路径表达式
正确地选取节点。路径表达式会从某个节点开始沿着节点树查找节点,直至找到目标节点。
由于节点的多样性,为了帮助开发人员快速选取目标节点,XPath 提供了一套语法规则。下面
从选取节点、谓语、选取未知节点、选取若干路径这 4 个方面介绍 XPath 的语法。

1.选取节点

选取节点是最基础的操作之一。节点所在的路径既可以从根节点开始,也可以从任意位
置开始。选取节点的表达式如表 4-3 所示。
478967fe596b433ca6d97d3b1cf50ba2.png

1bff45a1ca6d40bbb1c6b67530b71198.png

接下来,以 XML 文档 bookstore.xml 为例,为大家演示如何使用表 4-3 中的表达式选取
XML 文档中的节点。bookstore.xml 的具体内容如下。
<?xml version="1.0" encoding="ISO-8859-1"?> 
<bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <book> <title lang="eng">Learning XML</title> <price>39.95</price> </book> 
</bookstore>

        选取节点的示例代码如下。

 1 bookstore # 选取 bookstore 的所有子节点2 /bookstore # 选取根节点 bookstore 3 bookstore/book # 从根节点 bookstore 开始,向下选取名为 book 的所有子节点4 //book # 从任意节点开始,选取名为 book 的所有子节点5 bookstore//book # 从 bookstore 的后代节点中,选取名为 book 的所有子节点6 //@lang # 选取所有名为 lang 的属性节点
在上述代码中,第 3 行、第 4 行的路径表达式具有相同的功能,都可以选取节点 book 的所
有子节点。前者是从根节点开始沿着路径向下选取的,后者是从节点树的任意位置开始选取的。

2.谓语

谓语是为路径表达式附加的条件,主要用于筛选当前被处理的节点集,选取出满足某个
特定条件的节点,或者包含了指定属性或值的节点。谓语会嵌入方括号中,位于要补充说明
的节点后面。带谓语的路径表达式的语法格式如下:
节点[谓语]
在上述格式中,方括号中的谓语可以是整数、属性、函数,也可以是整数、属性、函数
与运算符组合的表达式。如果谓语是整数(从 1 开始),则这个数值将作为位置,用于从节点
集中选取与该位置对应的节点;如果是属性,则会从节点集中选取包含该属性的节点;如果
是函数,则会将该函数的返回值作为条件,从节点集中选取满足条件的节点。常用的 XPath
函数如表 4-4 所示。
e74661f6bf7e441195b30240688b518e.png

8f36aad2166e42e2b81d75efe0303246.png

接下来,以前面的 bookstore.xml 为例,为大家演示带谓语的路径表达式的用法,具体代
码如下。
/bookstore/book[1] # 选取属于 bookstore 子节点的第 1 个 book 节点
/bookstore/book[last()] # 选取属于 bookstore 子节点的最后一个 book 节点
/bookstore/book[last()-1] # 选取属于 bookstore 子节点的倒数第 2 个 book 节点
/bookstore/book[position()<3] # 选取属于 bookstore 子节点的前两个 book 节点
//title[@lang] # 选取所有的属性名称为 lang 的 title 节点
//title[@lang= 'eng'] # 选取所有的属性名称为 lang 且属性值为 eng 的 title 节点
# 选取子节点 price 的值大于 35.00,且父节点为 bookstore 的所有 book 节点
/bookstore/book[price>35.00] 
# 选取属于 book 的所有子节点 title,且节点 book 的子节点 price 的值必须大于 35.00 
/bookstore/book[price>35.00]/title

3.选取未知节点

表 4-5 选取未知节点的通配符和函数
通配符/函数说明
*
匹配任何元素节点
@*
匹配任何属性节点
node()
匹配任何类型的节点

        XPath 提供了选取未知节点的通配符和函数,关于它们的说明如表 4-5 所示。

        以前面的 XML 文档为例,演示表 4-5 中通配符和函数的用法,具体代码如下。

/bookstore/* # 选取属于 bookstore 的所有子节点
//* # 选取文档中的所有节点
//title[@*] # 选取所有带有属性的节点 title

4.选取若干路径

在 XPath 中,我们可以使用“|”运算符连接多个路径表达式,根据多个路径选取对应的
节点。以前面的 XML 文档为例,演示“|”运算符的用法,具体代码如下。
//book/title | //book/price # 选取属于 book 的子节点 title 和 price 
//title | //price # 选取所有 title 节点和 price 节点
# 选取属于/bookstore/book/的所有 title 节点和文档中的所有 price 节点
/bookstore/book/title | //price

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

git 合并master到分支

master分支的代码领先自己的分支,git 如何把master分支代码合并到自己的分支 1.首先切换到主分支 git checkout master 2.使用git pull 把领先的主分支代码pull下来 git pull 3.切换到自己的分支 git checkout xxx(自己的分支) 4.把主分支的代码merge到自己的分支 git merge ma…

minio+tusd+uppy搭建文件上传服务

1、docker部署minio、tusd服务 1.1 新建docker-compose.yml minio API: http://ip:9100 minio控制台: http://ip:9101 tus API: http://ip:9102/files/ tus webhooh: http:172.0.0.1:3000/files/webhooh(用户鉴权API) version: 3.7services:minio:image: minio/minio:RELEAS…

亚马逊运营专词(一)

许多新入驻亚马逊的大陆卖家&#xff0c;对亚马逊的专业词汇还不太了解&#xff0c;导致在运营店铺的过程出现一些问题&#xff0c;今天就来讲解一下亚马逊常用的运营专词&#xff0c;方便新手卖家深入了解。 1. Listing&#xff1a;亚马逊listing指的是产品的详情页面&#xf…

通过BLE实现类似UART的串行通信:NUS服务 vs GATT服务

在物联网和智能设备的发展中&#xff0c;蓝牙低功耗&#xff08;Bluetooth Low Energy, BLE&#xff09;技术已经成为无线数据传输的重要手段。本文将介绍通过BLE实现类似UART的串行通信&#xff0c;并对比NUS服务和GATT服务的使用场景&#xff0c;帮助开发者更好地选择适合的技…

2024越南医药、制药机械展

2024年越南国际医药&#xff0c;制药装备及技术展览会 时间&#xff1a; 2024年11月21--23日 地点&#xff1a;越南胡志明市-西贡会展中心SECC 2024年越南国际医药&#xff0c;制药装备及技术展览会将于2024年11月21-23日在越南胡志明市盛大举行&#xff01;展览会以国际化、专…

【Feature Pyramid Networks for Object Detection】

Feature Pyramid Networks for Object Detection 摘要引言2 相关工作3 FPN4 应用摘要 特征金字塔是识别系统中用于检测不同尺度对象的基本组件。但是,最近的深度学习对象检测器已经避免了金字塔表示,部分原因是它们在计算和内存方面都很密集。在这篇论文中,我们利用深度卷积…

LeetCode经典题之876、143 题解及延伸

系列目录 88.合并两个有序数组 52.螺旋数组 567.字符串的排列 643.子数组最大平均数 150.逆波兰表达式 61.旋转链表 160.相交链表 83.删除排序链表中的重复元素 389.找不同 1491.去掉最低工资和最高工资后的工资平均值 896.单调序列 206.反转链表 92.反转链表II 141.环形链表 …

paddleocr查看标注好的数据错误信息

字符计数 import os import json from collections import Counter# 按字符计数 label_dir"/Users/thy/Downloads/chinese20240613" zi_ls[] with open(os.path.join(label_dir,"Label.txt")) as f:linesf.readlines()for line in lines:line line.strip…

Java面试题:聚簇索引和非聚簇索引

聚簇索引和非聚簇索引 聚簇索引(聚集索引) 将数据的存储和索引放在一块,索引结构的叶子节点保存了行数据 索引字段必须存在,且只能存在一个 非聚集索引(二级索引) 将数据和索引分开存储,索引结构的叶子节点关联的是对应的主键 索引字段可以存在多个 索引的选取规则 如果…

【学习】常用的分类网络

1. LeNet 提出时间&#xff1a;1998年最新版本&#xff1a;原始版本使用的数据集格式&#xff1a;MNIST&#xff08;28x28灰度图像&#xff09;优点&#xff1a; 结构简单&#xff0c;易于理解和实现。对于小规模图像数据集&#xff08;如MNIST&#xff09;有很好的表现。缺点…

豆瓣高分项目管理书籍推荐

&#x1f4ec;豆瓣网站上有很多项目管理领域的书籍获得了较高的评分&#xff0c;以下是一些高分项目管理书籍的精选列表&#xff0c;发出来跟大家分享一下&#xff1a; 《项目管理知识体系指南&#xff08;PMBOK指南&#xff09;》 【内容简介】这本书是美国项目管理协会&…

opencv检测图片上七种颜色,分辨颜色和对应位置

opencv检测图片上七种颜色&#xff0c;分辨颜色和对应位置 读取图片&#xff1a;使用cv2.imread()函数读取目标图片。 转换颜色空间&#xff1a;通常在HSV颜色空间中进行颜色检测&#xff0c;因为HSV颜色空间更适合描述颜色的属性。 定义颜色范围&#xff1a;为七种颜色定义…

RabbitMQ 修改默认密码

RabbitMQ的一些常用命令 #启动rabbitmq service rabbitmq-server start# 查看rabbitMQ的运行状态 service rabbitmq-server status# 开启rabbitMQ的后台管理插件 rabbitmq-plugins enable rabbitmq_management # 重启RabbitMQ服务 service rabbitmq-server restart RabbitMQ的…

AcWing 797:差分 ← 一维差分模板题

【题目来源】https://www.acwing.com/problem/content/799/【题目描述】 输入一个长度为 n 的整数序列。 接下来输入 m 个操作&#xff0c;每个操作包含三个整数 l,r,c&#xff0c;表示将序列中 [l,r] 之间的每个数加上 c。 请你输出进行完所有操作后的序列。【输入格式】 第一…

富格林:正规操作实现稳健出金

富格林认为&#xff0c;当下的金融市场&#xff0c;投资者进行理财都会特别关注盈利效率高的产品&#xff0c;而近年来兴起的现货黄金&#xff0c;其高效的盈利效率吸引着大批朋友关注。不过&#xff0c;要想在这盈利出金&#xff0c;就得学习掌握正规的交易策略。下面富格林将…

onnx模型修改:去掉Dropout层

文章目录 尝试1&#xff1a;强行设置dropout层train mode为False尝试2&#xff1a;找到onnx模型中的dropout, train mode设置为False尝试3&#xff1a;直接删除dropout层&#xff0c;连接其输入输出结语 最近训练模型使用了tinyvit&#xff0c;性能挺强的&#xff1a; 但是导出…

超细毛搭配超宽设计,一款更呵护牙龈的牙刷

牙龈敏感的时候&#xff0c;刷牙特别难受&#xff0c;最近试了试惠百施&#xff08;EBISU&#xff09;65孔宽头软毛牙刷&#xff0c;感觉它的口腔护理体验很不错。这款牙刷的设计独特&#xff0c;采用宽头设计&#xff0c;一次就能刷两排牙齿&#xff0c;极大地提高了清洁效率。…

RS232自由转Profinet协议网关模块连接1200PLC与扫码枪通讯及手动清零案例

一、RS232和Profinet这两种通讯接口的特点和应用场景&#xff1a; RS232是一种串行通讯接口标准&#xff0c;常用于连接计算机和外部设备&#xff0c;传输速率较低但稳定可靠。Profinet则是一种工业以太网通讯协议&#xff0c;具有高速、实时性强的特点&#xff0c;适用于工业…

C/C++语言通过动态链表实现按需内存分配和使用(Linux Ubuntu 24.04环境)

我认为比较理想的内存使用方式应该实现这几个特性&#xff1a; 1. 分配一块能满足大多数情况下需求的内存&#xff0c;比如80%的情况下都不需要再次分配内存。 2. 对另外20%需要较多内存的情况&#xff0c;可以通过动态链表按需追加新的内存块。 3. 要对总共消耗的内存有一个…

【C语言】解决C语言报错:Dangling Pointer

文章目录 简介什么是Dangling PointerDangling Pointer的常见原因如何检测和调试Dangling Pointer解决Dangling Pointer的最佳实践详细实例解析示例1&#xff1a;释放内存后未将指针置为NULL示例2&#xff1a;返回指向局部变量的指针示例3&#xff1a;指针悬空后继续使用示例4&…