【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地址的要求 …...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
