当前位置: 首页 > news >正文

深入理解 XPath:XML 和 HTML 文档的利器

XPath(XML Path Language)是一种用于在 XML 和 HTML 文档中定位节点的语言。它常用于 XML 解析、Web 数据抓取(如 Selenium 或 Scrapy)以及配置文件解析。本文将带你深入了解 XPath 的语法、功能及其在实际中的应用。


目录

    • 一、什么是 XPath?
      • XPath 的核心概念:
    • 二、XPath 的基本语法
      • 1. **绝对路径和相对路径**
      • 2. **通配符**
      • 3. **谓词**
      • 4. **轴(Axes)**
    • 三、常用函数
      • 1. **字符串函数**
      • 2. **数值函数**
    • 四、XPath 实战案例
      • 1. **提取 HTML 页面中的特定数据**
      • 2. **使用 Selenium 自动化抓取**
    • 五、XPath 的优化技巧
      • 1. **避免绝对路径**
      • 2. **利用唯一属性**
      • 3. **减少层级嵌套**
    • 六、XPath 与 CSS 选择器的对比
    • 七、总结

一、什么是 XPath?

XPath 是 W3C 标准的一部分,主要用于在 XML 和 HTML 文档中通过路径表达式导航。它支持强大的查询功能,可以通过标签、属性、文本内容等多种方式快速定位节点。

XPath 的核心概念:

  1. 节点:文档的基本构成,包括元素节点、属性节点、文本节点等。
  2. 路径:用类似文件系统路径的方式表示节点的位置。
  3. 谓词:通过条件筛选节点。

二、XPath 的基本语法

XPath 使用路径表达式来选择节点。以下是一些常用的表达式和用法:

1. 绝对路径和相对路径

  • 绝对路径:以 / 开头,从根节点开始选择。

    /html/body/div
    

    匹配从根节点到 div 的完整路径。

  • 相对路径:以 // 开头,从任意位置匹配符合条件的节点。

    //div
    

    匹配文档中所有的 div 节点。

2. 通配符

  • *:匹配任意节点。
    /html/body/*  # 匹配 body 下的所有子节点
    
  • @*:匹配任意属性。
    //div[@*]  # 匹配具有任意属性的 div 节点
    

3. 谓词

谓词使用 [] 表示,用于过滤节点。

  • 按索引匹配:
    //div[1]  # 匹配第一个 div 节点
    
  • 按属性匹配:
    //div[@class='content']  # 匹配 class 属性为 'content' 的 div 节点
    
  • 按文本内容匹配:
    //div[text()='Hello World']  # 匹配内容为 'Hello World' 的 div 节点
    

4. 轴(Axes)

轴用于指定节点的关系,如父节点、兄弟节点、子节点等。

  • parent:选择父节点。
    //div/parent::body
    
  • child:选择子节点。
    /html/body/child::div
    
  • following-sibling:选择后续兄弟节点。
    //div/following-sibling::p
    

三、常用函数

XPath 提供了许多函数,用于进一步处理节点和属性:

1. 字符串函数

  • contains:检查是否包含子字符串。
    //div[contains(@class, 'header')]
    
  • starts-with:检查是否以某字符串开头。
    //div[starts-with(@id, 'main')]
    
  • substring:提取子字符串。
    //div[substring(@id, 1, 4) = 'main']
    

2. 数值函数

  • position:返回节点的索引。
    //li[position()=2]  # 匹配第二个 li 节点
    
  • last:返回最后一个节点的索引。
    //li[last()]
    

四、XPath 实战案例

1. 提取 HTML 页面中的特定数据

假设我们有以下 HTML 结构:

<div class="product"><p class="name">iPhone 15</p><p class="price">$999</p>
</div>

使用 XPath,我们可以轻松提取产品名称和价格:

  • 产品名称:
    //div[@class='product']/p[@class='name']/text()
    
  • 产品价格:
    //div[@class='product']/p[@class='price']/text()
    

2. 使用 Selenium 自动化抓取

在 Selenium 中使用 XPath,可以快速定位和操作元素:

from selenium import webdriverdriver = webdriver.Chrome()
driver.get('https://example.com')# 定位元素
product_name = driver.find_element(By.XPATH, "//p[@class='name']").text
print(product_name)

五、XPath 的优化技巧

1. 避免绝对路径

绝对路径容易因页面结构变化而失效,建议优先使用相对路径:

//div[@class='content']//a[text()='Learn More']

2. 利用唯一属性

优先选择具有唯一标识(如 id)的元素:

//*[@id='unique-id']

3. 减少层级嵌套

尽量简化路径层级,避免多余的节点:

//div[contains(@class, 'header')]/a

六、XPath 与 CSS 选择器的对比

功能XPathCSS 选择器
精准定位属性//div[@class='content']div.content
子节点定位//div/child::pdiv > p
支持兄弟节点关系//div/following-sibling::p不支持
支持逆向选择//p/parent::div不支持
文本内容筛选//div[text()='Hello']不支持

XPath 功能强大,但语法相对复杂;CSS 选择器简单直观,但功能有限。


七、总结

XPath 是处理 XML 和 HTML 数据的强大工具,其灵活的路径表达式和丰富的函数支持使其成为 Web 抓取和自动化测试的核心技术之一。在实际应用中,熟练掌握 XPath 的基本语法和函数,并根据场景选择最佳策略,可以极大提升效率。

希望本文对你理解和使用 XPath 提供了帮助!

相关文章:

深入理解 XPath:XML 和 HTML 文档的利器

XPath&#xff08;XML Path Language&#xff09;是一种用于在 XML 和 HTML 文档中定位节点的语言。它常用于 XML 解析、Web 数据抓取&#xff08;如 Selenium 或 Scrapy&#xff09;以及配置文件解析。本文将带你深入了解 XPath 的语法、功能及其在实际中的应用。 目录 一、什…...

DDR5 中的数据反馈判决均衡(DFE):全面解析与展望

目录 一、引言二、DFE原理三、DFE架构四、实现方案五、测试方法六、DFE效果七、成本与收益八、具体应用九、技术发展趋势十、参考文献 一、引言 DDR5 作为新一代内存标准&#xff0c;其中的数据反馈判决均衡&#xff08;DFE&#xff09;技术更是引人注目。DFE即判决反馈均衡&a…...

Axure高保真数据可视化大屏图表组件库

推出了一款高保真数据可视化大屏图表组件库&#xff0c;旨在为用户提供丰富的图表类型&#xff0c;使数据呈现更加直观、生动。本文将详细介绍该组件库中的各类图表元件&#xff0c;包括面积图、折线图、柱状图、条形图、圆环图、雷达图、仪表图以及综合类图表&#xff0c;以满…...

100个问题学 langchain 入门 (1/10)

100个问题学 langchain 入门 (1/10) 文章目录 100个问题学 langchain 入门 (1/10)前言**问题 1** 什么是 langchain&#xff0c;解决什么问题&#xff1f;**问题 2** LangChain 的核心组件有哪些&#xff1f;请列举并简要说明每个组件的作用。**问题 3** 在 LangChain 中&#…...

0001.基于springmvc简易酒店管理系统后台

一.系统架构 springmvcjsplayuimysql 二.功能特性 简单易学习&#xff0c;虽然版本比较老但是部署方便&#xff0c;tomcat环境即可启用&#xff1b;代码简洁&#xff0c;前后端代码提供可统一学习&#xff1b;祝愿您能成尽快为一位合格的程序员&#xff0c;愿世界没有BUG; …...

每日一题 326. 3 的幂

326. 3 的幂 简单 class Solution { public:bool isPowerOfThree(int n) {while(n > 3){if(n % 3 0){n n/3;}else{return false;}}return n 1;} };...

解码数据有序之道——常见排序算法总结

本文整理了常见的排序算法&#xff0c;采用c编码&#xff0c;并对其时间复杂度作以了分析。 1. 冒泡排序&#xff08;Bubble Sort&#xff09; 实现思路&#xff1a; 从数组的第一个元素开始&#xff0c;依次比较相邻的两个元素。如果当前元素大于下一个元素&#xff0c;则交…...

C语言实现图片文件的复制

在C语言中&#xff0c;直接处理图片文件&#xff08;如JPEG、PNG等&#xff09;的复制&#xff0c;通常涉及到文件I/O操作。这些图片文件是二进制文件&#xff0c;因此需要使用二进制模式读取和写入文件。 图片文件复制代码&#xff1a; #include <stdio.h> #include&l…...

一、windows上配置ninja环境

Ninja是Google的一名程序员推出的注重速度的构建工具&#xff0c;一般在Unix/Linux上的程序通过make/makefile来构建编译&#xff0c;而Ninja通过将编译任务并行组织&#xff0c;大大提高了构建速度。下面介绍了windows上配置Ninja环境。 1.下载Ninja ninja官网地址&#xff1…...

我们来编程 -- win11多jdk版本切换

题记 售前的酒喝到位了调研需求及文档整理出来了开发要入场了&#xff0c;真惨啊&#xff01;年底了&#xff0c;手里活干的好好的&#xff0c;因为flyback在项目地&#xff0c;硬是被安排进来了拥抱变化&#xff0c;我呸…不得不切换系统&#xff0c;构建代码&#xff0c;一股…...

JAVA 图形界面编程 AWT篇(1)

前言 为了应对JAVA课设&#xff0c;小编走上了java的图形界面编程的道路&#xff0c;通过博客分享自己的学习历程&#xff0c;并进行笔记的记录。 AWT&#xff08;Abstract Window Toolkit&#xff09;介绍 AWT&#xff08;抽象窗口工具包&#xff09;是 Java 最早的图形用户界…...

C语言 字符串输入输出函数、scanf(“%[^\n]“,)可输入空格 、fgets删除换行符

字符串输入函数&#xff1a; scanf&#xff08;"%s"&#xff0c;数组名&#xff09; gets&#xff08;数组名&#xff09; fgets&#xff08;&#xff09; --- 文件流输入函数 函数原型&#xff1a; int scanf( const char *format, ...…...

【蓝桥杯每日一题】推导部分和——带权并查集

推导部分和 2024-12-11 蓝桥杯每日一题 推导部分和 带权并查集 题目大意 对于一个长度为 ( N ) 的整数数列 A 1 , A 2 , ⋯ , A N A_1, A_2, \cdots, A_N A1​,A2​,⋯,AN​ &#xff0c;小蓝想知道下标 ( l ) 到 ( r ) 的部分和 ∑ i l r A i A l A l 1 ⋯ A r \sum_{…...

Linux 磁盘满了怎么办?快速排查和清理方法

当 Linux 磁盘满了&#xff0c;会导致系统无法正常运行&#xff0c;比如无法写入文件、服务停止、甚至系统崩溃。因此&#xff0c;快速排查并清理磁盘空间是非常重要的。以下是详细的排查和解决步骤&#xff1a; 一、快速定位磁盘占用原因 1. 检查磁盘使用情况 使用 df 命令查…...

【专题】2024年中国新能源汽车用车研究报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p38564 本年度&#xff0c;国家及地方政府持续发力&#xff0c;推出诸多政策组合拳&#xff0c;全力推动汽车产业向更高质量转型升级&#xff0c;积极鼓励消费升级&#xff0c;并大力推行以旧换新等惠民生、促发展举措。尤为引人注目…...

数据结构之链表笔试题详解

一&#xff1a;移除链表元素 我们很容易就可以想到一个解决方案&#xff1a;再创建一个链表&#xff0c;把不是val的结点拿过来尾插。 这样确实可以但是&#xff0c;我们每次尾插都需要遍历一遍整个链表&#xff0c;这样时间复杂度就变成了O(n^2)&#xff0c; 因此我们不妨设…...

结构化的Prompt

资源库&#xff1a; AI 提示词-WayToAGI精选高效的AI提示词库&#xff0c;助力创作者和开发者解锁人工智能的潜力。通过我们的提示词和策略&#xff0c;优化您的AI工具使用效率&#xff0c;激发创意思维&#xff0c;提升产出质量。https://www.waytoagi.com/prompts?tag6 结构…...

【数字化】华为数字化转型架构蓝图

导读&#xff1a;华为的数字化转型规划团队在2016年年底基于对愿景的系统诠释&#xff0c;整合出了数字化转型架构蓝图。该蓝图共分为5层&#xff0c;旨在通过数字化转型实现客户交互方式的转变、作战方式的转变、公司各平台业务能力的数字化、服务化以及运营模式的转变。 目录…...

最新全开源IM即时通讯系统源码(PC+WEB+IOS+Android)部署指南

全开源IM&#xff08;即时通讯&#xff09;系统源码部署是一个复杂但系统的过程&#xff0c;涉及多个组件和步骤。以下是一个详细的部署指南&#xff0c;旨在帮助开发者或系统管理员成功部署一个全开源的IM系统&#xff0c;如OpenIM。      IM即时通讯系统源码准备工作   …...

go 跨平台打包

GOARCH‌是Go语言中的一个环境变量&#xff0c;用于指定目标平台的底层架构。在Go的交叉编译过程中&#xff0c;‌GOARCH‌决定了编译出的二进制文件将在哪种硬件架构上运行。 GOARCH的常见值 ‌amd64‌&#xff1a;64位 x86 架构‌386‌&#xff1a;32位 x86 架构‌arm‌&am…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...