深入理解XPath文本节点的选取

在Web开发中,XPath是一种强大的工具,用于在HTML或XML文档中定位节点。今天,我们将深入探讨XPath在处理文本节点时的一个常见问题,并通过实际的HTML例子来解释如何正确地使用XPath。

问题描述

假设我们有一个HTML片段如下:

<td><ahref="#"class=""><iclass="far fa-times mr-1"></i>Cancel</a></td>

我们试图使用以下XPath来查找包含Cancel文本的<a>标签:

//a[contains(text(), 'Cancel')]

但是,这个XPath表达式并不工作。为什么呢?

问题分析

在HTML中,<a>标签的结构实际上是这样的:

<ahref="#"><!-- 第一个文本节点 --><iclass="far fa-times mr-1"></i><!-- 第二个文本节点 -->Cancel</a>

这里有两个关键点需要注意:

  1. 文本节点分割<a>标签包含两个文本节点,第一个节点是空白(包含空格),第二个节点是Cancel
  2. contains函数的限制contains函数的第一个参数必须是一个字符串,而这里由于存在两个文本节点,导致XPath无法正确匹配。

解决方案

解决方案1:使用.代替text()

//a[contains(., 'Cancel')]

.代表当前节点的全部文本内容,这将合并所有的文本节点,使得contains函数能够在单一字符串中进行查找。

解决方案2:使用normalize-space()

//a[contains(text()[normalize-space()], 'Cancel')]

normalize-space()函数会过滤掉空白字符,只保留有效的文本内容,这样只会剩下包含Cancel的文本节点。

实例说明

让我们通过一个更复杂的例子来进一步说明:

<div><ahref="#"class="">Some Text Here<iclass="far fa-times mr-1"></i>Cancel</a></div>

在这里,<a>标签包含了更多的文本节点:

  • Some Text Here(一个文本节点)
  • 一个<i>标签
  • Cancel(另一个文本节点)

使用上述两个XPath表达式,我们都可以成功找到这个<a>标签,因为它们都能正确处理文本节点的合并或过滤。

结论

在使用XPath查找包含特定文本的节点时,必须考虑到HTML文档中可能存在的多个文本节点。通过使用.或者normalize-space()函数,我们可以有效地处理这种情况,从而确保XPath表达式能够准确地定位到我们需要的元素。

希望这个博客对你理解XPath在处理文本节点时的行为有所帮助,欢迎在评论区分享你的见解或问题!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1156099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STLink与STM32怎么接线?一文说清基本连接步骤

STLink与STM32怎么接线&#xff1f;一文讲透调试连接的底层逻辑与实战要点在嵌入式开发中&#xff0c;一个看似简单的问题——STLink与STM32怎么接线&#xff0c;却常常让不少工程师卡在项目起步阶段。你有没有遇到过这样的情况&#xff1a;代码写好了&#xff0c;IDE也配置完毕…

商标被抢注、许可失控?这两个隐形坑,拖垮不少中小企业

某初创茶饮品牌靠一款爆款饮品火遍本地&#xff0c;门店刚拓展到5家&#xff0c;就收到了商标驳回通知书——核心品牌名已被一家空壳公司提前抢注&#xff0c;对方还拿着注册证找上门&#xff0c;要么花80万“赎回”商标&#xff0c;要么立即停用品牌名。更糟的是&#xff0c;品…

Spring Boot动态数据源实战,让数据库连接“随用随取”

数据源切换方法 Springboot提供了AbstractRoutingDataSource抽象类,类名意思是数据源路由,让用户可以选择根据需要切换当前数据源 该类提供了一个抽象方法determineCurrentLookupKey(), 切换数据源时springboot会调用这个方法,所以只需要实现该方法,在该方法中返回需要切换…

工业设备数据采集:SerialPort通信配置深度剖析

工业设备数据采集&#xff1a;SerialPort通信配置深度剖析 从“能通”到“稳通”&#xff1a;一个被低估的串口难题 在某次工厂远程监控系统升级项目中&#xff0c;工程师团队遇到了这样一个问题&#xff1a;三台温度传感器通过 RS-485 总线连接上位机&#xff0c;其中两台通…

图解Multisim主数据库配置流程:初学者轻松上手

图解Multisim主数据库配置&#xff1a;从“找不到元件”到高效设计的进阶之路你有没有遇到过这种情况——打开 Multisim 想画个简单电路&#xff0c;结果在“放置元件”窗口里翻了半天&#xff0c;连一个常见的LM358 运放都搜不到&#xff1f;或者好不容易找到了&#xff0c;一…

密度敏感哈希(DSH)学习算法详解

密度敏感哈希(Density Sensitive Hashing,简称DSH)是一种无监督哈希学习方法,其独特之处在于考虑数据的密度分布,通过自适应选择分割超平面来生成二进制码。这种方法在高密度区域分配更多比特位,从而提升哈希码的区分能力,特别适合非均匀分布的数据集,如图像特征或文本…

JFlash下载与Bootloader配合烧录技巧

JFlash 与 Bootloader 协同烧录&#xff1a;从原理到实战的深度指南在嵌入式开发中&#xff0c;一次“点下载就能跑”的固件更新看似简单&#xff0c;背后却可能隐藏着地址冲突、跳转失败、验证出错等无数坑点。尤其当系统引入了Bootloader&#xff0c;而你又想用J-Flash快速烧…

STM32H7系列(MPU Cache)

STM32H7 核心知识点总结 (MPU与Cache) 一、核心问题&#xff1a;H7为什么特殊&#xff1f; 根本原因&#xff1a;H7为追求高性能&#xff0c;采用了 “多块离散SRAM 多总线矩阵 多级Cache” 的复杂架构。这与传统MCU&#xff08;如F1/F4系列&#xff09;的 “连续大块SRAM 单…

基于STM32的工业touch驱动开发操作指南

手把手教你打造工业级STM32触摸驱动&#xff1a;从硬件到算法的全链路实战你有没有遇到过这样的场景&#xff1f;设备刚上电&#xff0c;操作员在屏幕上点了好几下&#xff0c;界面却迟迟没反应&#xff1b;或者冬天戴着手套一碰就误触发&#xff0c;夏天又完全没感应——这些看…

STLink驱动安装超详细版:从下载到配置全流程

从零搞定STLink驱动&#xff1a;一次讲清安装、配置与避坑全流程 你有没有遇到过这样的场景&#xff1f; 新买了一块STM32 Nucleo开发板&#xff0c;兴冲冲插上电脑准备烧录程序&#xff0c;结果打开设备管理器一看——“其他设备”下面躺着个带黄色感叹号的“未知USB设备”。…

基于STM32的I2C时序分析:核心要点一文说清

深入STM32的I2C时序&#xff1a;从协议到实战&#xff0c;彻底搞懂每一个电平跳变 在嵌入式开发中&#xff0c;你有没有遇到过这样的场景&#xff1f; 代码逻辑看似无懈可击&#xff0c;但传感器就是读不到数据&#xff1b;重启后偶尔通一次&#xff0c;再断&#xff1b;示波器…

基于STM32F4的USB设备模式实战案例解析

基于STM32F4的USB设备模式实战&#xff1a;从零实现一个免驱虚拟串口你有没有遇到过这样的场景&#xff1f;调试嵌入式系统时&#xff0c;手边只有笔记本电脑&#xff0c;没有RS232串口&#xff1b;或者现场工程师抱怨“这设备连不上&#xff0c;驱动装不了”&#xff1b;又或者…

STM32CubeMX配置I2S音频接口新手教程

用STM32CubeMX搞定I2S音频&#xff1a;从协议原理到实战调音的全链路指南你有没有遇到过这样的场景&#xff1f;项目需要在STM32上播放一段语音提示&#xff0c;结果声音断断续续、夹杂着“咔哒”噪声&#xff1b;或者录音时采样率不稳&#xff0c;语音识别模块频频误判。这些问…

51单片机控制LCD1602显示:超详细版入门指南

51单片机驱动LCD1602实战指南&#xff1a;从点亮第一行文字到构建人机界面你有没有遇到过这样的场景&#xff1f;电路板已经焊好&#xff0c;程序也烧录进去了&#xff0c;但设备“黑屏”一片&#xff0c;毫无反应。没有提示、没有状态、甚至连个“Hello World”都没有——调试…

arm64-v8a平台上的功耗管理策略完整示例

arm64-v8a平台上的功耗管理&#xff1a;从理论到实战的完整指南你有没有遇到过这样的情况&#xff1f;设备明明没有运行大型应用&#xff0c;电池却在快速掉电&#xff1b;或者系统响应突然变慢&#xff0c;温度传感器报警——这些往往不是硬件缺陷&#xff0c;而是功耗管理系统…

Keil4安装通俗解释:每个选项功能的清晰说明

Keil4安装全解析&#xff1a;不只是“下一步”&#xff0c;而是构建开发根基的关键决策 你有没有过这样的经历&#xff1f; 下载好Keil4的安装包&#xff0c;双击运行&#xff0c;面对一连串英文选项——“Select Folder for Tools”、“Install Driver for ULINK”、“Downlo…

隐藏式门把手再出致命隐患,断电锁死车门,差点出事故

1月11日安徽阜阳市S12滁新高速一辆电车因电量耗尽断电停在应急车道&#xff0c;驾驶人一家五口被困车内&#xff0c;报警求助&#xff0c;交警到达后问清原因后也无法帮忙打开车门&#xff0c;最后叫来拖车将车拖到附近服务区充电桩插上充电头才打开车门。对此&#xff0c;车主…

Keil优化等级选择对代码影响分析

Keil优化等级选择对代码影响的深度剖析&#xff1a;从调试到发布的实战权衡在嵌入式开发的世界里&#xff0c;我们常常面临一个微妙却至关重要的决策&#xff1a;该用哪个编译器优化等级&#xff1f;是追求极致性能、让代码跑得飞快的-O3&#xff0c;还是为了方便调试而保留所有…

STM32CubeMX用于PID控制系统的超详细版教程

从零构建高性能PID控制系统&#xff1a;STM32CubeMX实战全解析在嵌入式控制的世界里&#xff0c;你是否曾为一个简单的电机调速项目焦头烂额&#xff1f;明明算法写得没错&#xff0c;可转速就是抖个不停&#xff1b;或者ADC采样值跳来跳去&#xff0c;PID输出像喝醉了一样失控…