当前位置: 首页 > 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…...

GSS引擎的未来发展:约束式布局在Web开发中的趋势

GSS引擎的未来发展&#xff1a;约束式布局在Web开发中的趋势 【免费下载链接】engine GSS engine 项目地址: https://gitcode.com/gh_mirrors/engi/engine GSS&#xff08;Grid Style Sheet&#xff09;引擎作为约束式布局在Web开发中的革命性解决方案&#xff0c;正在重…...

G-Helper技术架构解析:华硕笔记本ACPI控制接口的轻量化实现

G-Helper技术架构解析&#xff1a;华硕笔记本ACPI控制接口的轻量化实现 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Stri…...

OpenClaw代码助手:Qwen3-14b_int4_awq实现的自动补全与错误检查

OpenClaw代码助手&#xff1a;Qwen3-14b_int4_awq实现的自动补全与错误检查 1. 为什么需要本地化代码助手&#xff1f; 作为一名长期与代码打交道的开发者&#xff0c;我一直在寻找能够提升编程效率的工具。传统的IDE插件虽然能提供基础补全&#xff0c;但存在几个痛点&#…...

Comsol水力压裂:考虑流固耦合损伤及热流固耦合的裂缝扩展模型

comsol水力压裂&#xff0c;裂缝扩展模型流固耦合损伤和热流固耦合损伤 在这个模型里面考虑了温度场、应力场、压力场和损伤场&#xff0c;采用的是Comsol内置的接口建模 整个模型呈正方形&#xff0c;内部开一个圆孔 在圆孔内壁施加高压低温流体&#xff0c;模型外边界在这个模…...

InfluxDB(一)——一个高效处理数据的时序数据库

目录 一、什么是时序数据库InfluxDB&#xff1f; 关系型数据库&#xff08;行式存储&#xff09;是怎么存的&#xff1f; 时序数据库&#xff08;列式存储&#xff09;是怎么存的&#xff1f; 二、InfluxDB的特点 1. 极致的写入性能 2. 高效的存储压缩 3. 独特的数据模型…...

**管线流程**:模型矩阵 × 视图矩阵 × 投影矩阵 × 顶点 → GPU自动完成裁剪/光栅化

一、二进制、八进制、十六进制的转换方法&#xff08;通俗版&#xff09; 本质&#xff1a;都是“逢几进一”的计数法&#xff0c;只是“底数”不同&#xff08;2/8/16&#xff09;。 二进制&#xff08;Base-2&#xff09;&#xff1a;只用 0 和 1&#xff0c;是计算机硬件唯一…...

基于Python的电影订票系统毕业设计源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于Python的电影订票系统&#xff0c;以满足现代观众对于便捷、高效电影购票服务的需求。具体研究目的如下&#xff1a; 首先&#xf…...

基于MMC的两端柔性直流输电系统设计仿真:包含电压平衡控制策略、最近电平调制策略、环流抑制及详...

基于MMC的两端柔性直流输电系统设计仿真 1、MMC-HVDC 电压平衡控制策略&#xff1a;为了实现桥臂子模块的电压动态平衡 在正常运行时&#xff0c;由于桥臂子模块投切存在不一致性&#xff0c;以及级联的子模块中的电容不断的在充电、放电或者闭锁状态切换 2、最近电平调制策略&…...

3D 效果与深度:现代 UI 设计的立体革命

3D 效果与深度&#xff1a;现代 UI 设计的立体革命探索如何在 2024 年通过 CSS 和 Flutter 实现令人惊叹的 3D UI 效果&#xff0c;为用户界面增添深度和层次感。一、3D 设计的崛起 在当今的数字设计领域&#xff0c;平面化设计已经不再是唯一的选择。随着硬件性能的提升和浏览…...

用YOLOv8-pose玩点不一样的:手把手教你用Python+OpenCV把姿态关键点画成卡通小人

用YOLOv8-pose玩转创意姿态可视化&#xff1a;从骨架连线到卡通角色设计 当计算机视觉遇上创意表达&#xff0c;枯燥的骨架连线就能变身活灵活现的卡通角色。想象一下&#xff0c;你的健身应用里不再是单调的线条小人&#xff0c;而是穿着背带裤跳舞的虚拟形象&#xff1b;教学…...