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

server/2024/12/16 20:08:13/
html" title=xml>xmlns="http://www.w3.org/2000/svg" style="display: none;">

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 结构:

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 提供了帮助!


http://www.ppmy.cn/server/150713.html

相关文章

Debezium OracleErrorHandler 分析

Debezium OracleErrorHandler 分析 目录 1. 概述2. 主要功能3. 实现分析4. 使用场景5. 示例6. 最佳实践7. 总结1. 概述 OracleErrorHandler 是 Debezium Oracle 连接器中的错误处理组件,负责处理连接器运行过程中遇到的各种异常情况。它主要用于: 判断错误是否可重试处理数…

revit转gltf,revit转3dtiles,如何将Revit模型转为3DTiles格式并在Cesiumjs中高效可视化

Revit模型导出gltf、glb与3dtiles有多种方式&#xff0c;但一般的商业工具收费普遍较高&#xff1a;Cesiumlab导出3dTile格式数据&#xff0c;Cesiumlab暂时可试用3天&#xff0c;会员版收费每年800&#xff1b;BimAngleEngine导出3dTile格式数据BimAngleEngine暂时可试用30天&…

架构未来:深入探索最热门的编程语言开发框架

开发框架组件简介 开发框架是程序员用来加速开发并确保代码质量的基础组件之一。在不同的编程语言中&#xff0c;开发框架为开发人员提供了丰富的工具、库和最佳实践&#xff0c;帮助构建高效、可维护和安全的应用程序。本文将介绍几种常见编程语言的开发框架组件&#xff0c;…

opencv——图片添加水印

本实验中添加水印的概念其实可以理解为将一张图片中的某个物体或者图案提取出来&#xff0c;然后叠加到另一张图片上。具体的操作思想是通过将原始图片转换成灰度图&#xff0c;并进行二值化处理&#xff0c;去除背景部分&#xff0c;得到一个类似掩膜的图像。然后将这个二值化…

前端 mp4 视频改成 m3u8 流模式

前端 mp4 视频改成 m3u8 流模式 mp4 视频的问题 1、mp4 视频通常对应一个文件&#xff0c;播放时需要加载全部文件&#xff0c;消耗网络资源。如果用户从中间某个时间访问&#xff0c;也会从头开始下载&#xff0c;浪费服务器性能。 2、mp4 视频文件容易被用户下载到本地。有…

相机(Camera)硬件组成详解

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 写在前面&#xff1a;可以去B站观看一些相机原理的视频来配合学习&#xff0c;这里推荐&#xff1a;推荐1&#xff0c;推荐2&#xff0c;推荐3 相机&#xff08;Camera&#xff09;是一种复杂的光…

绘图方式集合

1. 流程图 1.1 PlantUML 代码绘制流程图 1.1.1 简介 1.1.2 网站 你可以使用以下网站来将 PlantUML 代码转换成可视化的流程图&#xff1a; PlantUML 官方网站 网站地址&#xff1a;https://plantuml.com/plantuml此网站提供了一个在线工具&#xff0c;可以直接输入 PlantUM…

分享从零开始学习网络设备配置--任务6.4 使用高级ACL限制服务器端口防攻击

任务描述 某公司构建了互联互通的办公网。北京总部的网络核心使用一台三层路由器设备连接不同子网&#xff0c;构建企业办公网络。通过三层技术一方面实现办公网络互联互通&#xff0c;另一方面把办公网接入Internet网络。 公司在天津设有一分公司&#xff0c;使用三层设备的…