【Python爬虫实战】XPath与lxml实现高效XML/HTML数据解析
🌈个人主页:https://blog.csdn.net/2401_86688088?type=blog
🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html
目录
前言
一、为什么学习xpath和lxml
(一)高效解析和提取数据
(二)灵活处理复杂的 HTML 和 XML 结构
(三)与其他工具相比更强的功能性
(四)广泛应用于 Web 抓取和数据解析
(五)易于学习和应用
(六)xpath和lxml总结
二、xpath介绍
(一)XPath 的核心概念
(二)XPath 的主要功能
(三)示例
(四)应用
(五)xpath总结
三、xpath语法
(一)基本路径表达式
(二)节点选择
(三)条件筛选
(四)运算符
(五)常用的函数
(六)示例
(七)xpath语法总结
四、总结
前言
在数据处理和 Web 抓取领域,快速、精准地解析和提取信息至关重要。XPath 和 lxml 是两个用于处理 XML 和 HTML 数据的强大工具。XPath 是一种查询语言,能够通过路径表达式从结构化文档中轻松提取节点和元素;而 lxml 是一个高效的 Python 库,专注于解析和操作 XML 和 HTML 文档。通过学习 XPath 和 lxml,我们可以轻松应对复杂的数据提取和解析任务,从而在 Web 抓取、数据转换、配置文件解析等应用场景中更高效地获取所需信息。
一、为什么学习xpath和lxml
学习 XPath 和 lxml 的原因主要在于它们在处理和解析 XML 和 HTML 数据方面的强大功能。以下是详细原因:
(一)高效解析和提取数据
-
XPath 是一种用于在 XML 和 HTML 文档中定位节点的查询语言。它使得我们可以用简单的路径表达式从文档中提取出特定的元素或文本内容。相比于传统的字符串查找方法,XPath 更加精确和高效。
-
lxml 是一个高性能的库,专门用于解析和处理 XML 和 HTML。它基于 C 语言编写的 libxml2 和 libxslt,因而处理速度很快,非常适合大规模数据解析任务。
(二)灵活处理复杂的 HTML 和 XML 结构
-
在 Web 抓取任务中,很多网页的 HTML 结构可能比较复杂,且带有嵌套标签。使用 XPath 可以轻松地选择嵌套元素或按照层级关系定位所需数据。
-
lxml 提供了对 XPath 的强大支持,结合 lxml 和 XPath 可以方便地处理 XML 或 HTML 文档的结构化数据提取,使得解析过程更加灵活和可控。
(三)与其他工具相比更强的功能性
-
虽然 BeautifulSoup 等库也可以解析 HTML,但 lxml 的速度更快,功能也更加全面。lxml 支持更复杂的 XPath 表达式,可以实现更加精准的数据提取。
-
相比于使用正则表达式来解析 HTML(容易出错且代码复杂),使用 lxml 和 XPath 更加简洁且易于维护。
(四)广泛应用于 Web 抓取和数据解析
-
XPath 和 lxml 是 Web 抓取中常用的工具。通过解析 HTML,用户可以提取网页中的文本、链接、图片等各种内容,广泛应用于数据采集和分析。
-
它们也被用于各种 XML 数据解析任务中,比如 RSS 源数据处理、配置文件读取、数据转换等。
(五)易于学习和应用
-
XPath 表达式相对容易学习,通过简单的路径语法就可以在复杂的文档中定位节点,适合初学者快速上手。
-
lxml 的 API 设计简洁明了,结合 XPath 使用起来直观易懂,能够极大提升 XML 和 HTML 数据的处理效率。
(六)xpath和lxml总结
学习 XPath 和 lxml 能够帮助我们更加高效和准确地处理 XML 和 HTML 数据。无论是 Web 数据抓取、数据转换、配置文件解析,还是其他文本处理任务,这两者都是非常有用的工具。通过掌握 XPath 和 lxml,你将能够更高效地应对数据处理中的各种挑战。
二、xpath介绍
XPath是一种用于在 XML 文档中查找信息的语言。它通过路径表达式来选择节点,允许用户从 XML 或 HTML 文档中导航、选择特定的节点或元素,非常适合数据提取和解析。XPath 主要用于 XML 文档,但也广泛用于 HTML 文档的解析,尤其是在 Web 抓取中。
(一)XPath 的核心概念
XPath 的表达式类似于文件路径,使用斜杠(/
)表示层级关系,可以根据标签名、属性、层级结构等来选择特定的元素。
XPath 路径表达式
-
绝对路径:从根节点开始,以
/
开头。-
/root/tag
表示从根节点开始选择特定的子节点。
-
-
相对路径:以
//
开头,用于选择文档中符合条件的所有节点,而不考虑位置。-
//tag
表示文档中所有名为tag
的节点。
-
-
层级选择:
-
.
表示当前节点。 -
..
表示父节点。
-
-
属性选择:使用
@
选择节点的属性。-
//tag[@attribute='value']
表示选择指定属性值的节点。
-
常用表达式
-
//tag
:选择所有名为tag
的元素。 -
//tag[@attribute='value']
:选择指定属性attribute
等于某值value
的元素。 -
//tag[text()='text']
:选择文本内容为指定值的tag
标签。 -
//tag[position()=n]
:选择文档中的第n
个tag
标签。 -
//tag[1]
:选择文档中的第一个tag
标签。
(二)XPath 的主要功能
xpath的主要功能如下:
-
节点选择:可以选择单个或多个节点,根据层级、属性、文本内容等条件选择目标元素。
-
筛选:通过
[]
可以指定过滤条件,例如属性值、位置、内容等。 -
文本和属性提取:可以直接提取节点的文本内容或节点的属性值。
(三)示例
假设有以下 HTML 结构,我们可以用 XPath 表达式来提取信息:
<div><p class="text">Hello World</p><p class="text">Hello XPath</p>
</div>
XPath 表达式示例:
-
//p[@class='text']
:选择所有具有class='text'
属性的<p>
标签。 -
//p[@class='text'][1]/text()
:选择第一个<p>
标签的文本内容。
(四)应用
-
XML 解析:XPath 是解析 XML 文档的重要工具,用于提取、筛选、操作节点。
-
HTML 数据抓取:在 Web 抓取中,结合 Python 库(如 lxml),XPath 可以提取 HTML 文档中的特定元素,广泛用于网页数据抓取。
-
数据转换和查询:适合在 XML 数据中查找和查询,常用于配置文件和数据传输中的节点查找。
(五)xpath总结
XPath 是一种功能强大的查询语言,通过路径表达式快速准确地从 XML 或 HTML 文档中选择节点和元素。其简洁灵活的语法和强大的定位功能,使其在数据提取、Web 抓取等任务中不可或缺。
三、xpath语法
XPath 语法用于在 XML 或 HTML 文档中定位和选择节点。通过路径表达式和一些特殊操作符,XPath 可以快速、精准地提取所需的内容。以下是 XPath 的基本语法和常用表达式:
(一)基本路径表达式
-
/
:选择根节点。-
例如,
/html
选择根节点<html>
。
-
-
//
:选择文档中符合条件的所有节点,不考虑它们的位置。-
例如,
//div
选择文档中所有的<div>
标签。
-
-
.
:表示当前节点。 -
..
:表示父节点。
(二)节点选择
-
tagname
:选择指定的标签名。-
例如,
//p
选择所有的<p>
标签。
-
-
*
:通配符,表示匹配任意节点。-
例如,
//div/*
选择<div>
下的所有子节点。
-
(三)条件筛选
条件筛选使用 []
包含特定条件,以筛选符合条件的节点。
-
//tag[@attribute='value']
:选择具有特定属性值的节点。-
例如,
//a[@href='example.com']
选择所有href
属性值为example.com
的<a>
标签。
-
-
//tag[text()='value']
:选择文本内容为特定值的节点。-
例如,
//p[text()='Hello']
选择内容为Hello
的<p>
标签。
-
-
//tag[position()=n]
:选择特定位置的节点。-
例如,
//li[position()=1]
选择第一个<li>
标签。
-
-
//tag[last()]
:选择该层级中的最后一个节点。-
例如,
//tr[last()]
选择最后一个<tr>
标签。
-
-
//tag[@attribute]
:选择具有某个属性的节点。-
例如,
//img[@src]
选择所有带有src
属性的<img>
标签。
-
(四)运算符
-
|
:用于并集,选择多个路径匹配的节点。-
例如,
//h1 | //h2
选择所有<h1>
和<h2>
标签。
-
-
+
、-
、*
、div
:用于数学运算。-
例如,
count(//book) + 5
表示书的数量加 5。
-
-
<
、>
、<=
、>=
、=
、!=
:比较运算符。-
例如,
//book[price > 30]
选择所有价格大于 30 的书。
-
(五)常用的函数
-
text()
:获取节点的文本内容。-
例如,
//p/text()
获取所有<p>
标签的文本内容。
-
-
contains()
:检查某个字符串是否包含在节点的值中。-
例如,
//p[contains(text(), 'Hello')]
选择文本内容包含Hello
的<p>
标签。
-
-
starts-with()
:检查字符串是否以指定内容开头。-
例如,
//p[starts-with(@class, 'intro')]
选择所有class
属性值以intro
开头的<p>
标签。
-
-
count()
:返回符合条件的节点数量。-
例如,
count(//book)
返回<book>
标签的数量。
-
-
last()
:选择最后一个符合条件的节点。-
例如,
//li[last()]
选择最后一个<li>
标签。
-
(六)示例
假设有如下 XML 结构:
<library><book><title lang="en">Harry Potter</title><price>29.99</price></book><book><title lang="fr">Le Petit Prince</title><price>19.99</price></book>
</library>
-
//book/title
:选择所有<title>
标签。 -
//book/title[@lang='en']
:选择语言属性为en
的<title>
标签。 -
//book[price > 20]
:选择价格大于 20 的<book>
标签。 -
//book[last()]/title
:选择最后一本书的<title>
标签。
(七)xpath语法总结
XPath 是用于在 XML 和 HTML 文档中高效定位和筛选数据的查询语言。通过路径表达式、条件筛选、函数、运算符等,XPath 允许我们灵活、精准地提取所需内容,非常适合数据解析和 Web 抓取。
四、总结
XPath 和 lxml 的结合提供了灵活而高效的解析 XML 和 HTML 文档的能力。XPath 的路径表达式使我们能够快速选择和筛选节点,lxml 则以其高性能和全面的功能支持常见的 Web 数据处理任务。从基础的节点选择到复杂的条件筛选和函数应用,XPath 的丰富语法为我们带来了多样化的解析方法。通过熟练掌握这些工具,我们不仅能在数据提取和解析上提升效率,还能在实际应用中更好地应对复杂的数据处理需求。
相关文章:

【Python爬虫实战】XPath与lxml实现高效XML/HTML数据解析
🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、为什么学习xpath和lxml (一)高效解析和提取数据 …...

软件测试学习笔记丨Selenium学习笔记:元素定位与操作
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/22510 本文为霍格沃兹测试开发学社的学习经历分享,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 说明:本篇博客基于sel…...
在 HTML 中,<input> 元素支持的事件汇总
在 HTML 中,<input> 元素支持多种事件,这些事件可以在用户与输入字段交互时触发。以下是一些常见的 <input> 事件: input: 当 <input> 元素的值发生变化时触发。适用于文本、数字、日期等类型的输入。 change: 当 <inp…...

vue3【实战】 渲染 md 文件(markdown语法 .md后缀的文件)
1. 安装相关插件 npm i unplugin-vue-markdown markdown-it-prism prism unhead/vue2. 添加配置 src/main.ts // 给 md 文件创建头部 import { createHead } from unhead/vue // md 文件中代码高亮的样式 import prismjs/themes/prism.css // 自定义 md 文件的样式 import /as…...

Sora高端制造业WordPress外贸主题
Sora是一款专为高端制造业设计的WordPress主题,由国内知名wordpress开发团队简站wordpress主题开发,它以红色为主色调,适合外贸企业出海建独立站的模板。这个主题适用于WordPress 6.0及以上版本,并且只服务于真正有需要的用户。主…...
windows安装superset及各种问题解决
1,背景 先说说背景,之前在2月份已经安装过superset3.1.1,当时还没有提示SECRET_KEY异常,能正常运行,且已配置数据库连接. 2,报错信息及解决途径 1,创建admin时,提示Error! User already exists 这个是因为之前已经创建过admin用户,需要删除C:\Users\用户名\.superset下的.…...

JMeter模拟并发请求
PostMan不是严格意义上的并发请求工具,实际是串行的,如果需要测试后台接口并发时程序的准确性,建议采用JMeter工具。 案例:JMeter设置20个并发卖票请求,查看后台是否存在超卖的情况 方式一:一共10张票&…...

【小趴菜前端实习日记5】
实习日记5 一、vue3中如何使用router(获取this)二、ts中用object定义类型太宽泛导致Ts无法推断出正确类型三、动态设置日记封面失败vite动态引入静态资源1.方法一vue3父子组件生命周期执行顺序 2.方法二3.方法三 四、打包问题总结1.The import.meta meta-property i…...

如何通过谷歌外推占据搜索引擎首页?
外贸企业在推广过程中,如何在谷歌搜索引擎中占据有利位置,获取更多曝光,GLB谷歌霸屏服务就可以派上用场。它通过高效的品牌外推策略,可以让你的企业信息在谷歌中实现“霸屏”效果,特别是长尾关键词的全面覆盖 很多企业…...
jmeter学习(6)逻辑控制器
1. 简单控制器 简单控制器用来存放组件的,没有提供什么逻辑功能。 2. 循环控制器 用来循环执行请求,可以配置循环次数。注意它与线程组、测试计划中的循环是相互独立的,比如在线程组中设置循环2次,循环控制器设置循环3次&#…...
Android14 和android12 在锁屏界面Keyguard输错5次密码后倒计时30秒时重启手机不显示倒计时
参考如下修改:Android9.0在锁屏界面Keyguard输错5次密码后倒计时30秒时重启手机不显示倒计时_android 锁屏密码输错5次-CSDN博客 android 14 修改如下: androidap/SYSTEM/frameworks/base$ git status Refresh index: 100% (47218/47218), done. HEAD d…...

智能时代摩托车一键启动无钥匙进入感受科技前线
向智能化与高性能迈进,技术创新与绿色转型引领摩托车行业智能化出行。 摩托车一键启动无钥匙进入功能是一种先进的车辆控制系统,它允许驾驶员在不使用传统机械钥匙的情况下,通过智能感应技术自动解锁和启动摩托车。这种系统通常包括一个智能钥匙&#x…...
需要补充的技能
密码管理 文件管理 人际管理 Microsoft365 teams和onedrive,outlook,sharepoint等 被问到自己不懂的问题的时候怎么迅速反应快速回答? 被帅锅的时候怎么解决? 谈判技巧? 说话的语速? 遇到解决不了的问题如何处理? 考…...
15分钟学 Go 第 15 天:映射(Map)
第15天:映射(Map) 学习目标 在本节中,我们将深入理解Go语言中的字典类型(映射),通过例子与图示来帮助你掌握其使用方法。我们将涵盖以下几个方面: 概念定义创建和使用映射访问和更…...

element-plus 官方表格排序问题
element-plus 官方API 默认表格排序存在问题,一个list 被多组排序 修改后: 注意点: 这里一定要使用 sortable"custom",自定义 sort-change 方法 使用 sortable true 的情况排序会冲突,出现莫名奇妙的问题…...

AI语音模型在家宽业务中的应用
在运营商家宽业务支撑场景中,存在多个APP和系统需要与装维人员交互,传统的功能按钮点击型操作交互界面,越来越难以满足装维人员工作提效的迫切需求。家宽施工调度系统所需的AI语音能力主要包括ASR(音转字)和TTS&#x…...
零七生活API-文字转语音API使用示例
//官网地址:零七生活API - 提供免费接口调用平台function getAud(){axios({method: get,url: https://api.oick.cn/api/txt?text你好&spd5&apikeyyourApikey,responseType: blob, // 确保 axios 处理为二进制数据}).then((response) > {// 将 Blob 转换…...
rpc的客户端为什么称为stub
1.client为什么是stub Stub 在分布式系统中是一种 代理对象(Proxy Object),它本质上是一个在本地系统中扮演远程服务角色的代理。 在早期的 RPC 术语中,客户端端叫做 Stub,而服务器端的处理部分叫做 Skeleton。这种对…...

RHCE--nginx实现多IP访问多网站
方法一:nmtui 1.目录挂载 2.下载nginx 3.关闭防火墙 4.在一个网卡创建多个虚拟地址 1. 2. 3. 方法二:nmcil 1.手动配置 2.如图所示重新连接后创建ip成功 3.创建目录以及写入 结果...

TikTok运营对IP有什么要求?
TikTok在进行直播带货时,网络环境的配置尤为关键,网络质量直接影响到直播效果,因此选择稳定的IP地址很重要。那么,TikTok直播时该选择什么样的IP地址呢?接下来,我们来深入分析一下。 TikTok对IP地址的要求 …...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...