Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
XPath的@符号是什么意思?怎么选择属性?_创想鸟

XPath的@符号是什么意思?怎么选择属性?

xpath中根据属性值定位元素的关键是使用@符号结合属性名和匹配条件,最常见的写法是//tagname[@attributename=’attributevalue’],例如//div[@id=’main’]可精准定位id为main的div元素;当需要处理不完全匹配的场景时,可借助contains(@attributename, ‘substring’)判断属性值是否包含指定子串,如//[contains(@class, ‘active’)]用于匹配class包含active的元素;starts-with(@attributename, ‘prefix’)可匹配以特定字符串开头的属性值,如//[starts-with(@id, ‘user-‘)]用于选取id以user-开头的元素;ends-with函数(仅xpath 2.0+支持)可判断结尾字符串;normalize-space()可用于清理属性值中的多余空白;还可通过and、or逻辑运算符组合多个属性条件,如//a[@href=’/products’ and @class=’nav-link’];当属性名不确定时,可用@匹配任意属性,或结合name()函数判断属性名,如//[starts-with(name(@*), ‘data-‘)]用于选取具有以data-开头属性名的元素;此外,属性选择(@)与文本内容选择(text())有本质区别,@用于获取标签内的元数据(如id、class),而text()用于获取标签间的文本内容,二者不可混淆,正确理解这一差异是高效使用xpath的基础。

XPath的@符号是什么意思?怎么选择属性?

XPath表达式中的

@

符号,它是一个明确的指示符,告诉解析器你正在寻找的是元素的“属性”(attribute),而不是它的子元素或文本内容。简单来说,它就是用来选择HTML或XML标签内部那些键值对信息(比如

id="myId"

class="button"

)的。当你需要根据这些属性来定位或提取数据时,

@

符号就是你的利器。

解决方案

理解

@

符号的关键在于,它将你的焦点从元素本身转移到了元素的元数据上。一个HTML标签,比如

,它有

div

这个标签名,也有

id

class

这两个属性。如果你想选择这个

div

元素,通常会用

//div

。但如果你想基于它的

id

属性来选择,或者仅仅是想获取它的

class

属性值,

@

就派上用场了。

最常见的用法是

@attributeName

。例如,要选择所有带有

id

属性的元素,你可以写

//*[@id]

。这里的

*

代表任何元素,

[@id]

则表示这个元素必须有一个

id

属性。如果我想更精确地选择那个

id

main

div

,表达式会是

//div[@id='main']

。这真的是我用XPath时最常用的模式之一,因为它能非常精准地定位到页面上独一无二的元素。

当然,你也可以直接选择某个元素的特定属性值。比如,要获取上述

div

class

属性值,表达式是

//div[@id='main']/@class

。这个表达式会返回

container

这个字符串。这种能力在处理那些内容不固定,但属性值相对稳定的元素时特别有用,比如一个按钮的

data-action

属性。

XPath其实也提供了一个更冗长的写法,叫做

attribute::attributeName

,比如

//div/attribute::id

。但说实话,日常开发中几乎没人这么写,

@

符号实在是太简洁、太直观了,它已经成了XPath里一个约定俗成的惯例。在我看来,这种简洁性是XPath能够如此流行的原因之一。

XPath中如何根据属性值定位元素?

在我个人的经验里,根据属性值定位元素是XPath最核心、最实用的功能之一,简直是网页抓取和自动化测试的基石。当你面对一个复杂的网页,仅仅靠标签名或层级关系往往不够,因为很多元素可能长得一样,但它们的属性值却能区分彼此。

最直接的方式就是使用等号

=

进行精确匹配:

//tagName[@attributeName='attributeValue']

例如,如果你想找到所有

class

属性值为

button primary

的按钮,你可以写:

//button[@class='button primary']

这会找到所有

这样的元素。

但实际情况往往更复杂,属性值可能不完全匹配,或者包含动态部分。这时候,XPath提供了一些非常实用的函数来处理这种情况:

contains(string, substring)

:检查一个字符串是否包含另一个子字符串。这在我处理CSS类名时特别常见,一个元素可能同时有多个类,比如

class="item active selected"

。如果我只关心它是否是

active

的,我就会用:

//*[contains(@class, 'active')]

这会匹配任何

class

属性中包含

active

这个词的元素。这比精确匹配要灵活得多,也更能适应前端框架动态添加类名的场景。

starts-with(string, substring)

:检查一个字符串是否以某个子字符串开头。这对于那些有命名规范的属性非常有用,比如

id="user-123"

id="user-456"

。如果你想找到所有用户相关的元素,可以这样:

//*[starts-with(@id, 'user-')]

ends-with(string, substring)

(XPath 2.0及以上支持,很多浏览器内置的XPath解析器可能不支持,需要注意兼容性):检查一个字符串是否以某个子字符串结尾。

//*[ends-with(@src, '.png')]

normalize-space(string)

:移除字符串开头和结尾的空白字符,并用单个空格替换字符串内部的连续空白字符。这在处理一些不规范的HTML时非常有用,比如属性值可能有多余的空格。

//div[normalize-space(@class)='card']

or

and

运算符:你可以组合多个条件来更精确地定位。

//a[@href='/products' and @class='nav-link']

或者

//button[@id='submit' or @name='send']

这些灵活的匹配方式,让XPath在处理各种复杂的网页结构时显得游刃有余。我经常发现,一个看似无从下手的问题,通过巧妙地组合这些属性匹配函数,就能迎刃而解。

当属性名不确定时,XPath如何灵活选择?

有时候,你会遇到一些“顽皮”的网页,它们的属性名可能不是固定的,或者你希望选择所有具有任何属性的元素。这种情况下,XPath同样提供了解决方案,让我觉得它在设计上考虑得相当周全。

最直接的方式是使用

*

通配符来匹配任何属性:

//*[@*]

这个表达式会选择页面上所有至少拥有一个属性的元素。这在某些场景下非常有用,比如你想统计页面上所有带有自定义属性(如

data-*

)的元素,但你不知道具体的属性名。

如果你需要更进一步,例如,你只想选择那些属性名以特定前缀开头的属性,或者你想获取所有属性的名称,

name()

函数就能派上用场了。

//*[starts-with(name(@*), 'data-')]

这个表达式会选择所有至少有一个属性,且该属性名以

data-

开头的元素。这对于处理现代前端框架中大量使用的

data-

属性非常有效。比如,你可能想抓取所有

data-id

data-value

的元素,而不需要关心具体的

data-

属性名是什么。

另一个场景是,你可能知道元素肯定有一个特定的属性,但它的名字可能会变。例如,一个验证码图片的URL可能在

src

属性里,也可能在

data-src

里。这时候,你可以用

or

来尝试匹配多个可能的属性名:

//img[@src or @data-src]

这会匹配任何有

src

属性或者有

data-src

属性的

img

标签。

虽然这些高级用法不那么常用,但它们的存在,无疑增强了XPath处理复杂、动态网页的能力。我个人觉得,当你需要处理一些“非典型”的定位需求时,这些技巧往往能帮你打开思路。

XPath属性选择与文本内容选择有何不同?

这是XPath初学者经常会混淆的一个点,但理解它们的区别至关重要。简单来说,属性选择是关于元素“标签内部的元信息”,而文本内容选择则是关于元素“标签之间包裹的内容”。

想象一个HTML片段:

Hello World!

属性选择 (

@

):当你使用

@

符号时,你是在关注

标签内部的

class="intro"

这部分。

//p/@class

:这会返回

intro

。它获取的是

p

元素的

class

属性的值。你不能用

//p/@text()

,因为

text()

不是一个属性,它是内容。

文本内容选择 (

text()

):当你使用

text()

函数时,你是在关注

标签开始和结束标签之间包裹的可见文本。

//p/text()

:这会返回

Hello

!

(注意,它会返回直接子文本节点,不包含子元素

内的文本)。如果你想获取一个元素及其所有子元素拼接起来的完整文本内容(包括

World

中的

World

),通常会直接选择元素,然后获取其

string-value

,或者在某些库中调用

.text()

方法。在XPath表达式中,

//p

通常会代表整个

p

元素的节点,当它被转换为字符串时,会包含其所有后代文本。你不能用

//p[@text()='Hello World!']

来定位,因为

text()

是节点测试,不是属性。正确的定位方式是

//p[contains(., 'Hello World!')]

或者

//p[text()='Hello World!']

(如果文本是直接子节点)。

核心区别总结:

@attributeName

:指向元素的某个特定属性的值。它存在于元素的“开标签”内部。

text()

:指向元素的直接文本子节点。它存在于元素的“开标签”和“闭标签”之间。

.

(点号):在谓语中,

.

代表当前节点。当用于字符串比较时,它通常会取当前节点的字符串值,这通常是其所有后代文本内容的拼接。例如,

//p[contains(., 'World')]

会匹配包含“World”的

p

元素,无论“World”是在

p

的直接文本中还是在其子元素

span

中。

理解这个根本差异,是高效编写XPath表达式的关键。在我看来,区分清楚“元数据”(属性)和“实际内容”(文本)是XPath学习过程中非常重要的一步,它能帮助你避免很多常见的错误,并更精准地定位目标。

以上就是XPath的@符号是什么意思?怎么选择属性?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1430211.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
XPath的last()函数有什么作用?怎么用?
上一篇 2025年12月17日 03:26:07
XML的XInclude错误处理机制有哪些注意事项?
下一篇 2025年12月17日 03:26:21

相关推荐

  • tk做养生类目起号前期发什么视频?tk表示什么类目?

    在TikTok上运营养生类账号,起号阶段的内容策略尤为关键。优质的内容不仅能快速吸引目标用户,还能为后续发展奠定良好基础。本文将深入解析初期应发布的视频类型,并澄清“TK”所指的平台属性及内容分类体系。 一、养生类目起号初期适合发布哪些视频内容? 刚开始做养生赛道时,重点不在于变现,而在于建立专业形…

    2026年9月22日
    000
  • PHP如何利用缓存优化实时输出_PHP实时输出与缓存结合优化

    PHP实时输出需结合输出缓冲控制与flush()强制推送,同时考虑服务器和浏览器缓存影响;2. 长时间任务应使用APCu或Redis缓存频繁数据,避免重复计算;3. 动态页面可采用分块输出与片段缓存策略,静态内容从缓存读取,动态部分边生成边输出;4. 更优方案是通过异步任务与Redis存储进度,前端…

    2026年9月22日
    000
  • 华为天际通Go将支持eSIM:设备在路上了

    华为天际通Go将支持eSIM:设备在路上了华为天际通Go将支持eSIM:设备在路上了华为天际通Go将支持eSIM:设备在路上了华为天际通Go将支持eSIM:设备在路上了

    9月3日消息,今年的iphone 17 air将仅支持esim,彻底移除实体sim卡槽结构。随着新品发布日期的临近,国内esim政策的进展也愈发引人关注。 然而综合多方信息来看,iPhone 17 Air国行版本可能无法赶上首发,因前期在国内无法使用eSIM服务,导致该机型短期内难以在国内上市。 相…

    2026年9月22日 用户投稿
    000
  • VSCode配置C语言调试环境 从零开始VSCode搭建C开发工具

    要从零开始在#%#$#%@%@%$#%$#%#%#$%@_e2fc++805085e25c9761616c00e065bfe8中搭建c语言开发和调试环境,首先需安装vscode本体、c/c++编译器(如mingw或gcc)并配置系统环境变量,接着安装vscode的c/c++扩展,然后创建项目并编写c…

    2026年9月22日
    000
  • 如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程

    如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程

    PhotoLab的AI裁剪功能通过智能识别主体与构图原则,提供优化裁剪建议,区别于传统手动裁剪的纯物理操作,能自动应用美学法则提升照片视觉吸引力;在人像、社交媒体适配、风景静物等场景中表现突出,尤其擅长保留核心焦点并适配多平台比例;用户可导入图片后使用AI裁剪工具,系统分析画面并生成建议裁剪框,支持…

    2026年9月22日 用户投稿
    000
  • 递归实现列表排序检查与条件移除最大值

    本文详细介绍了如何使用Java递归方法处理整数列表。核心内容包括:首先检查列表是否已排序,如果已排序则直接返回false;如果未排序,则查找列表中的最大值。仅当最大值位于列表的起始或结束位置时,才将其移除并递归地继续处理列表。如果最大值位于列表中间,则打印当前列表并终止递归。 在数据处理和算法设计中…

    2026年9月22日
    000
  • VSCode如何实现代码可视化调试 VSCode执行流程图形化分析方法

    vscode的可视化调试功能通过内置调试器和扩展生态,显著提升代码理解与问题排查效率。1. 首先配置launch.json文件以定义调试环境,支持多种语言如node.js、python等;2. 在代码中设置断点,程序运行至断点时暂停,便于检查变量状态和执行上下文;3. 利用调试面板查看变量、监视表达…

    2026年9月22日
    000
  • MySQL备份压缩与加密技巧_MySQL提升备份安全与效率

    MySQL备份压缩与加密技巧_MySQL提升备份安全与效率MySQL备份压缩与加密技巧_MySQL提升备份安全与效率MySQL备份压缩与加密技巧_MySQL提升备份安全与效率MySQL备份压缩与加密技巧_MySQL提升备份安全与效率

    mysql备份压缩与加密的核心在于减少存储空间并提升数据安全性。1. 压缩能显著降低存储成本,提升传输效率,加快恢复速度,简化备份管理,并有助于满足合规要求;2. 加密则通过防止未授权访问保障数据安全。实现方式主要有:1. 使用mysqldump结合gzip和gpg/openssl进行逻辑备份、压缩…

    2026年9月22日 用户投稿
    100
  • VS Code中Dockerized PHP项目:解决PHP版本冲突的教程

    本教程旨在解决在VS Code中开发Dockerized PHP项目时,VS Code默认识别宿主机PHP版本而非容器内PHP版本的问题。核心解决方案是利用VS Code的Remote – Containers扩展,实现直接在Docker容器内部进行代码开发,从而确保VS Code及其所…

    2026年9月22日
    200
  • 蔡司2亿影像大小王,年度影像旗舰vivo X300系列发布!

    蔡司2亿影像大小王,年度影像旗舰vivo X300系列发布!蔡司2亿影像大小王,年度影像旗舰vivo X300系列发布!蔡司2亿影像大小王,年度影像旗舰vivo X300系列发布!蔡司2亿影像大小王,年度影像旗舰vivo X300系列发布!

    PConline最新资讯,vivo于今晚正式揭晓X300系列新机,定位“全焦段影像旗舰”,起售价为4399元。该系列成为首款搭载联发科天玑9500芯片的智能手机,并携手三星与索尼共同定制多颗影像传感器,在影像能力、屏幕素质及续航表现上力求全面跃升。 产品线涵盖X300与X300 Pro两款机型,价格…

    2026年9月22日 用户投稿
    000
  • 从AI场景搭建到蝴蝶号运营,全流程实战攻略

    从AI场景搭建到蝴蝶号运营,全流程实战攻略从AI场景搭建到蝴蝶号运营,全流程实战攻略从AI场景搭建到蝴蝶号运营,全流程实战攻略从AI场景搭建到蝴蝶号运营,全流程实战攻略

    做ai内容变现需先明确方向再选工具,注册蝴蝶号要模拟真实行为,用ai提升效率但需调整内容细节,流量转化重于播放量。一、先确定内容类型和风格,根据方向选择合适ai工具链搭建流程,用免费api测试效果。二、蝴蝶号注册尽量用企业主体,资料完整,养号阶段关注同类账号,保持每天发布1~2条内容,视频控制在30…

    2026年9月22日 用户投稿
    100
  • UC浏览器为什么无法登录某些网站账号_UC浏览器部分网站无法登录原因及对策

    首先关闭广告过滤功能,清除缓存与Cookie,关闭云端加速,切换网络或DNS,最后尝试桌面模式或其他浏览器解决UC浏览器登录无响应问题。 如果您尝试在UC浏览器中登录某个网站账号,但页面无响应或提示错误,则可能是由于浏览器的安全策略、缓存问题或设置限制导致无法正常加载登录界面。以下是解决此问题的步骤…

    2026年9月22日
    100
  • GIMP中如何利用AI裁剪图片?一步步完成高效图像裁剪方法

    GIMP虽无“一键AI裁剪”功能,但可通过智能选择工具(如前景选择、智能剪刀)精准选中主体,结合Resynthesizer插件的内容感知填充实现类AI裁剪效果;对于更高要求,可协同Remove.bg等外部AI工具完成自动抠图,再导入GIMP进行裁剪或背景替换,形成高效智能裁剪工作流。 ☞☞☞AI 智…

    2026年9月22日
    100
  • 疑似荣耀500系列入网 代号Merry全系支持80W有线快充

    10月25日,知名数码博主“数码闲聊站”透露,荣耀500系列新机已现身工信部,型号分别为mep-an00和mey-an00,预计代号为merry/merryp,全系支持80w有线快充。该博主还表示,此前上手的样机提供了黑色、银色、粉色和蓝色等多种配色方案,外观设计或将延续前代爆款风格。 据最新消息,…

    2026年9月22日
    000
  • VSCode搭建Python开发环境(附详细截图,小白也能学会)

    答案:搭建VSCode Python环境需安装Python并添加至PATH,安装VSCode及Python扩展,创建项目文件并选择正确解释器,通过虚拟环境隔离依赖,利用Pylance、Black、Flake8等工具提升开发效率,常见问题多为路径或环境配置错误,可通过检查解释器选择和安装路径解决。 在…

    2026年9月22日
    100
  • PHP each() 函数的替代方案:自定义实现与常见错误修正

    本文探讨了PHP中已废弃的each()函数的替代方案。针对常见的自定义实现,如myEach(),文章详细指出了其在返回数组结构中常犯的错误,并提供了正确的代码示例,以确保替代函数能够模拟each()的预期行为,帮助开发者编写更健壮、兼容未来的PHP代码。 理解 each() 函数及其废弃背景 在PH…

    2026年9月22日
    000
  • Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析

    Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析Vision Transformer 必读系列之图像分类综述(三): MLP、ConvMixer 和架构分析

    号外号外!awesome-vit 上新啦, 欢迎大家 Star Star Star ~ https://github.com/open-mmlab/awesome-vit 前言 在 Vision Transformer 必读系列之图像分类综述(一):概述 一文中对 Vision Transforme…

    2026年9月22日 用户投稿
    200
  • 蝴蝶号无人直播完整流程详解:搭建+开播+引流

    蝴蝶号无人直播完整流程详解:搭建+开播+引流蝴蝶号无人直播完整流程详解:搭建+开播+引流蝴蝶号无人直播完整流程详解:搭建+开播+引流蝴蝶号无人直播完整流程详解:搭建+开播+引流

    蝴蝶号无人直播的完整流程包括前期准备、直播搭建、开播设置、引流推广、监控与维护五个步骤。前期准备需完成账号注册认证、硬件设备配置、软件安装及素材准备;直播搭建涉及场景设置、素材导入、循环播放设定及自动化脚本配置;开播设置包括直播间信息填写、推流配置与测试直播;引流推广可通过平台内工具、社交媒体、内容…

    2026年9月22日 用户投稿
    100
  • 如何在VEED.io中制作AI视频?在线工具快速剪辑AI内容的步骤

    如何在VEED.io中制作AI视频?在线工具快速剪辑AI内容的步骤如何在VEED.io中制作AI视频?在线工具快速剪辑AI内容的步骤如何在VEED.io中制作AI视频?在线工具快速剪辑AI内容的步骤如何在VEED.io中制作AI视频?在线工具快速剪辑AI内容的步骤

    VEED.io通过“文本转视频”和“AI形象”功能,让视频制作变得简单高效。用户只需输入文本,即可生成带AI配音、字幕和匹配素材的视频,或选择AI虚拟人物进行口型同步播报。平台还提供AI语音合成、自动字幕、多语言支持及丰富编辑功能,便于后期精修。优化效果需从高质量文本入手,合理选择声音与形象,并通过…

    2026年9月22日 用户投稿
    000
  • Java中递归处理列表:条件性移除最大值策略与实现

    本教程深入探讨了如何在Java中使用递归方法,根据特定条件(如列表是否已排序、最大值是否位于列表的首尾)来移除列表中的最大值。文章将详细阐述如何设计一个高效的递归算法,包括排序检查、最大值定位以及条件性移除的实现细节,并提供完整的代码示例和注意事项,帮助读者掌握递归在复杂列表操作中的应用。 引言:递…

    2026年9月22日
    000

发表回复

登录后才能评论
关注微信