当前位置: 首页 > 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 提供了帮助!

http://www.lryc.cn/news/504183.html

相关文章:

  • DDR5 中的数据反馈判决均衡(DFE):全面解析与展望
  • Axure高保真数据可视化大屏图表组件库
  • 100个问题学 langchain 入门 (1/10)
  • 0001.基于springmvc简易酒店管理系统后台
  • 每日一题 326. 3 的幂
  • 解码数据有序之道——常见排序算法总结
  • C语言实现图片文件的复制
  • 一、windows上配置ninja环境
  • 我们来编程 -- win11多jdk版本切换
  • JAVA 图形界面编程 AWT篇(1)
  • C语言 字符串输入输出函数、scanf(“%[^\n]“,)可输入空格 、fgets删除换行符
  • 【蓝桥杯每日一题】推导部分和——带权并查集
  • Linux 磁盘满了怎么办?快速排查和清理方法
  • 【专题】2024年中国新能源汽车用车研究报告汇总PDF洞察(附原数据表)
  • 数据结构之链表笔试题详解
  • 结构化的Prompt
  • 【数字化】华为数字化转型架构蓝图
  • 最新全开源IM即时通讯系统源码(PC+WEB+IOS+Android)部署指南
  • go 跨平台打包
  • C++ 给定字符串,然后给出开始要取的位置,返回取到的信息
  • 【树莓派4B】MindSpore lite 部署demo
  • Idea汉化插件Datagrip汉化插件
  • 精彩回顾|Cocos开发者沙龙长沙站
  • 算法日记 49 day 图论(A*算法)
  • 服务器批量清理redis keys,无法适用客户端必须直连的情况
  • Grafana配置告警规则推送企微机器人服务器资源告警
  • 数字货币金融研究,深度学习虚拟币价格预测 数据集 市值top20 (2014年—2024年)
  • druid.properties图标是齿轮
  • 【图像处理】利用numpy、opencv、python实现车牌检测
  • ModuleNotFoundError: No module named ‘torchvision.transforms.functional_tensor‘