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

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

复制代码
//*[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 ...] 更稳。

相关推荐
INGNIGHT3 小时前
1908 · 布尔表达式求值(stack单调栈&dfs)
开发语言·c++·算法
এ慕ོ冬℘゜3 小时前
深入理解浏览器全屏 API:从 requestFullscreen 到全屏实战
开发语言·html
七夜zippoe4 小时前
DolphinDB 高可用部署实战:从容灾设计到故障自动转移
开发语言·python·高可用·容灾·dolphindb
不会就选b4 小时前
Linux之线程池(三)
linux·开发语言
棉晗榜4 小时前
C# HttpClient配置具有tls指纹发起跟浏览器一样的请求解决反爬虫防护
开发语言·爬虫·c#
l1t5 小时前
DeepSeek总结的DuckDB 如何更快地运行递归 CTE
java·开发语言·数据库·mysql·duckdb
HAPPY酷5 小时前
python的对象和方法
开发语言·python
橙露5 小时前
移动端客户端原生开发语言
开发语言
Demon--hx5 小时前
设计不能被继承的类
开发语言·c++
兔兔兔兔15 小时前
记录C++ 13
开发语言·c++·算法