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

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...