一日一技:XPath『不包含』应该怎么写?

简介: 一日一技:XPath『不包含』应该怎么写?

摄影:产品经理厨师:kingname

假设有这样一段HTML代码:

<html>
    <head>
        <title>测试XPath移除功能</title>
    </head>
    <body>
        <div class="post">
            <div class="quote">无关紧要的引用内容</div>
                你好啊
                <strong>产品经理</strong>,
                <span>很高兴认识你</span>
        </div>
    </body>
</html>

我想把其中的 你好啊产品经理,很高兴认识你提取出来。

如果我们把XPath写成:

//div[@class="post"]/text()

运行效果如下图所示:

这是因为 /text()只会获取当前标签下面的文本,不会获取子标签的文本。

为了解决这个问题,我们在 /text()前面再添加一根斜线:

//div[@class="post"]//text()

这样就可以抓取这个 div标签及其子标签下面的所有文本。运行效果如下图所示:

现在问题来了, 无关紧要的引用内容是我不想要的,但是却被无差别抓取进来了。

如果能够实现,抓取 class="post"这个 div标签下的文本和除了 class="quote"以外的所有子节点的文本就好了。

如果没有 你好啊这三个字,那么XPath可以这样写:

//div[@class="post"]//*[not(@class="quote")]/text()

这里的 //*[not(@class="quote")]的意思是说,这个 div标签下面的所有 class不为"quote"的子标签的文本。

运行效果如下图所示:

但比较麻烦的是, 你好啊这一句,它就是 div标签下的文本,它不属于任何子标签。所以上面的XPath无法获取到。

为了单独直接获取 div下面的内容,我们需要使用 |再拼接一个 XPath

//div[@class="post"]/text() | //div[@class="post"]//*[not(@class="quote")]/text()

运行效果如下图所示:

不过结果是一个列表,并且有很多换行符,看起来不够清晰,于是用Python再进行清洗。最终效果如下图所示:

目录
相关文章
|
6月前
|
C++ 开发者
2C++的程序的构成和书写形式
2C++的程序的构成和书写形式
43 2
|
JavaScript 前端开发
js正则表达式的作用及使用方法
js正则表达式的作用及使用方法
105 1
|
前端开发 开发者
评论列表案例-演示艾特符号替代相对路径的好处|学习笔记
快速学习评论列表案例-演示艾特符号替代相对路径的好处
454 0
LanguageTool最简范例代码
LanguageTool最简范例代码
124 0
|
JavaScript 网络架构
ES6知识点补充——剩余参数、展开语法
JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来了解剩余参数、展开语法
191 0
|
JavaScript 算法 前端开发
ES6知识点补充——模板字符串、默认参数
JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来了解模板字符串、默认参数
203 0
|
Java Maven
编写一个 spootboot 程序,有二个方法,一个问早上好,一个说再见
编写一个 spootboot 程序,有二个方法,一个问早上好,一个说再见
|
Java Spring
Springboot 同一次调用日志怎么用ID串起来,方便最终查找
Springboot 同一次调用日志怎么用ID串起来,方便最终查找
452 0
Springboot 同一次调用日志怎么用ID串起来,方便最终查找
|
前端开发
评论列表案例-演示艾特符号替代相对路径的好处
评论列表案例-演示艾特符号替代相对路径的好处
|
缓存 API
如何写出高质量的代码 data 组件 函数 注释 命名 变量的次数
如何写出高质量的代码 data 组件 函数 注释 命名 变量的次数