网络爬虫中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

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

基于python的随机森林多分类模型

1.随机森林多分类模型 1.1 基本原理 随机森林&#xff08;Random Forest&#xff09;是一种基于决策树的集成学习方法&#xff0c;它通过将多个决策树进行组合&#xff0c;以投票或平均的方式得到最终的预测结果。在多分类问题中&#xff0c;随机森林通过构建多个决策树&#…

Gartner发布开发敏捷网络安全计划指南:安全计划是一个在快速变化的环境中运作的复杂生态系统

随着企业数字化程度的提高&#xff0c;它们面临的网络安全风险和威胁只会增加。这项研究有助于高管领导了解敏捷网络安全计划的重要性&#xff0c;以及如何与安全和风险利益相关者合作&#xff0c;为下一次重大破坏做好准备。 主要发现 新冠肺炎疫情、地区冲突、全球政治紧张局…

cropperjs 裁剪/框选图片

1.效果 2.使用组件 <!-- 父级 --><Cropper ref"cropperRef" :imgUrl"url" searchImg"searchImg"></Cropper>3.封装组件 <template><el-dialog :title"title" :visible.sync"dialogVisible" wi…

游戏服务器研究二:大世界的 scale 问题

这是一个非常陈旧的话题了&#xff0c;没什么新鲜的&#xff0c;但本人对 scale 比较感兴趣&#xff0c;所以研究得比较多。 本文不会探讨 MMO 类的网游提升单服承载人数有没有意义&#xff0c;只单纯讨论技术上如何实现。 像 moba、fps、棋牌、体育竞技等 “开房间类型的游戏…

前端:HTML、CSS、JavaScript 代码注释 / 注释与代码规范

一、HTML 行内注释 HTML注释是在HTML代码中添加说明和解释的一种方法&#xff0c;这些注释不会被浏览器渲染或显示在页面上&#xff0c;而是被浏览器忽略。HTML注释对于代码的可读性、可维护性和团队协作非常重要。 1.1、HTML注释的语法 HTML注释的语法是以<!--开始&…

中小学劳技课程开展创意木工 传承非遗木工魅力

学生劳技课程&#xff0c;全称劳动技术课程&#xff0c;是一门旨在通过实践活动培养学生的劳动技能、创新思维、实践能力和社会责任感的基础教育课程。这门课程强调学生的参与和体验&#xff0c;让学生在动手实践中学习并掌握知识&#xff0c;提高解决问题的能力。 学生劳技课程…

大模型应用研发基础环境配置(Miniconda、Python、Jupyter Lab、Ollama等)

老牛同学之前使用的MacBook Pro电脑配置有点旧&#xff08;2015 年生产&#xff09;&#xff0c;跑大模型感觉有点吃力&#xff0c;操作起来有点卡顿&#xff0c;因此不得已捡起了尘封了快两年的MateBook Pro电脑&#xff08;老牛同学其实不太喜欢用 Windows 电脑做研发工作&am…

解码数智升级良方:中国一拖、中原传媒、神火股份等企业数字化实践分析

大模型、AI等技术的成熟以及政策法规的细化&#xff0c;数据资源的权属论证、合规确权、资产论证等环节逐渐走向实用性、价值化。 而伴随着“业财税数融”综合性数字化成为企业数字化转型的主流选择&#xff0c;财务部门的纽带属性被放大&#xff0c;财务数据的融合能力成为企业…

ABC234G Divide a Sequence 题解

题目来源 ABC234G 洛谷 Description 给定长度为 n n n 的序列 { a n } \{a_n\} {an​}。定义一种将 { a n } \{a_n\} {an​} 划分为若干段的方案的价值为每段的最大值减去最小值的差的乘积。求所有划分方案的价值的总和并对 998244353 998244353 998244353 取模。 1 ≤…

Vue3 使用 Vue Router 时,params 传参失效

前言&#xff1a; 在写项目的时候&#xff0c;使用了 vue-router 的 params 进行传参&#xff0c;但是在详情页面中一直获取不到参数。原因&#xff1a;Vue Router 在2022-8-22的那次更新后&#xff0c;使用这种方式在新页面上无法获取&#xff01; 正文&#xff1a; 在列表页进…

从零开始做题:老照片中的密码

老照片中的密码 1.题目 1.1 给出图片如下 1.2 给出如下提示 这张老照片中的人使用的是莫尔斯电报机&#xff0c;莫尔斯电报机分为莫尔斯人工电报机和莫尔斯自动电报机&#xff08;简称莫尔斯快机&#xff09;。莫尔斯人工电报机是一种最简单的电报机&#xff0c;由三个部分组…

【笔记】从零开始做一个精灵龙女-拆uv阶段

目录 先回顾一下拆uv的基础流程吧 肩部盔甲分UV示例 手环UV部分 腰带UV部分 其它也差不多&#xff0c;需要删掉一半的就先提前删掉一半&#xff0c;然后把不需要的被遮挡的面也删掉 龙角UV 胸甲UV 侧边碎发UV 马尾UV 脸部/耳朵UV 特殊情况&#xff1a;如果要删一半再…

kafka的命令行操作

kafka-topics.bat 该命令行和主题相关 kafka启动后&#xff0c;默认端口为9092,可修改 找到kafka_2.13-3.6.2\bin\windows目录下的kafka-topics.bat&#xff0c;用cmd执行 按下会有提示&#xff0c;REQURIED代表为必输项 创建topic 创建一个名为test的topic队列 kafka-t…

绘制图形

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在前3节的实例中&#xff0c;我们一直绘制的都是直线&#xff0c;实际上&#xff0c;海龟绘图还可以绘制其他形状的图形&#xff0c;如圆形、多边形等…

FineReport聚合报表与操作

一、报表类型 模板设计是 FineReport 学习过程中的主要难题所在&#xff0c;FineReport 模板设计主要包括普通报表、聚合报表、决策报表三种设计类型。 报表类型简介- FineReport帮助文档 - 全面的报表使用教程和学习资料 二、聚合报表 2-1 介绍 聚合报表指一个报表中包含多个…

STM32的SPI通信

1 SPI协议简介 SPI&#xff08;Serial Peripheral Interface&#xff09;协议是由摩托罗拉公司提出的通信协议&#xff0c;即串行外围设备接口&#xff0c;是一种高速全双工的通信总线。它被广泛地使用在ADC、LCD等设备与MCU间&#xff0c;使用于对通信速率要求较高的场合。 …

扩散模型 GLIDE:35 亿参数的情况下优于 120 亿参数的 DALL-E 模型

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

LeetCode 算法:二叉树的层序遍历 c++

原题链接&#x1f517;&#xff1a;二叉树的层序遍历 难度&#xff1a;中等⭐️⭐️ 题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;roo…

TensorFlow开源项目

欢迎来到 Papicatch的博客 文章目录 &#x1f349;TensorFlow介绍 &#x1f349;主要特点和功能 &#x1f348;多语言支持 &#x1f348;灵活的架构 &#x1f348;分布式训练 &#x1f348;跨平台部署 &#x1f348;强大的工具链 &#x1f348;丰富的社区和生态系统 &a…

人工智能与物联网:融合创新驱动未来

引言 人工智能&#xff08;AI&#xff09;指的是计算机系统模拟人类智能的能力&#xff0c;包括学习、推理、问题解决、理解自然语言以及感知和响应环境的能力。AI技术涵盖了机器学习、深度学习、神经网络、自然语言处理等领域&#xff0c;广泛应用于图像识别、语音识别、自动驾…