Xpaht self::div 轴语法

self::div 是 XPath 里的 轴语法,意思是:

复制代码
当前节点自己是不是 div 标签

比如这个 XPath:

复制代码
//*[self::div and contains(@class, 'title')]

可以拆开理解:

复制代码
//* 

先找页面上所有元素。

复制代码
[self::div and contains(@class, 'title')]

然后筛选:当前这个元素本身必须是 div,并且 class 包含 title。

所以它基本等价于:

复制代码
//div[contains(@class, 'title')]

你看到的这段:

复制代码
//*[self::div and (contains(@class, 'title') or contains(@class, 'desc_block'))]

意思是:

复制代码
找所有元素里,当前元素本身是 div,并且 class 包含 title 或 desc_block 的元素

等价于更普通的写法:

复制代码
//div[contains(@class, 'title') or contains(@class, 'desc_block')]

那为什么有时候用 self::div?

主要是为了方便兼容多个标签类型。比如你不确定弹框文案是在 div、span、p 哪个标签里,可以写:

复制代码
//*[self::div or self::span or self::p]

意思是:

复制代码
当前元素可以是 div,也可以是 span,也可以是 p

例如:

复制代码
//*[self::div or self::span or self::p]
[contains(translate(normalize-space(.), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'your verification')]
[contains(translate(normalize-space(.), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'under review')]

如果你这里只想匹配 div,可以不用 self::div,直接写:

复制代码
String xpath =
        "//div[(contains(@class, 'title') or contains(@class, 'desc_block')) "
                + "and contains(translate(normalize-space(.), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'your verification') "
                + "and contains(translate(normalize-space(.), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'under review')]";

这个更直观。


如果你想更通用,兼容 div/span/p,就用 self:::

复制代码
String xpath =
        "//*[(self::div or self::span or self::p) "
                + "and (contains(@class, 'title') or contains(@class, 'desc_block')) "
                + "and contains(translate(normalize-space(.), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'your verification') "
                + "and contains(translate(normalize-space(.), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'under review')]";

简单记:

复制代码
self::div

就是:

复制代码
当前节点自己是 div

self::span

就是:

复制代码
当前节点自己是 span

self::div or self::span

就是:

复制代码
当前节点可以是 div 或 span

你这个场景,如果 DOM 里确定就是 div,直接用 //div[...] 就行;如果前端标签可能变,用 //*[self::div or self::span or self::p ...] 更稳。

相关推荐
学逆向的7 小时前
C 堆区内存管理
c语言·开发语言·网络安全
huoyueyi7 小时前
《融天AI-APP从0到1开发实录》
开发语言·lua
OpenAnolis小助手9 小时前
PHP 两个严重漏洞曝光,龙蜥社区 24 小时完成 3 版本修复
开发语言·操作系统·php·龙蜥社区
阿尼卡~9 小时前
VS Code 配置 C 语言开发环境(Windows 10/11):从 GCC 安装到运行、断点调试,一篇搞定
c语言·开发语言·windows
hhhjhl11 小时前
Undici 跨端三方库仓颉适配全流程
java·开发语言·ubuntu
染指111011 小时前
158.Agent-LangGraph-子图(共享状态和不共享状态模式)
开发语言·人工智能·python·ui·agent·agents
wangchunyu11411 小时前
JAVA JVM内存结构与运行时数据区
java·开发语言·jvm
slongzhang_11 小时前
linux 递归删除源码文件|递归删除目录下 *.js,但排除 *.min.js
linux·开发语言·javascript
云和数据.ChenGuang12 小时前
Python 常见特殊方法详解:__new__、__init__、__del__、__str__、__repr__ 与 __getattribute__
开发语言·人工智能·python·1024程序员节
xyouyuweizhu13 小时前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python