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 ...] 更稳。

相关推荐
keykey6.1 小时前
卷积神经网络(CNN):让AI学会“看“
开发语言·人工智能·深度学习·机器学习
IsJunJianXin1 小时前
谷歌搜索cookie NID逆向生成
开发语言·python·google搜索·sgss·nid-cookie·算法生成nid·google-cookie
weikecms1 小时前
美团霸王餐报名API接口
java·开发语言
繁星蓝雨1 小时前
C++中对比pragma once和ifndef的使用区别
开发语言·c++·ifndef·头文件·pragma once
.千余1 小时前
【C++】C++手写Vector容器:从底层源码模拟实现
开发语言·c++·经验分享·笔记·学习
a诠释淡然2 小时前
C++ vs Rust:哪个更适合你的下一个项目?
开发语言·c++·rust
meilindehuzi_a2 小时前
深入理解 JavaScript 执行机制:从编译阶段到调用栈底层实现
开发语言·javascript·ecmascript
小小de风呀2 小时前
de风——【从零开始学C++】(十二):stack和queue的基本使用和模拟实现
开发语言·c++
huohaiyu2 小时前
深入解析Java垃圾回收机制
java·开发语言·算法·gc