一日一技: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再进行清洗。最终效果如下图所示:

目录
相关文章
|
8月前
|
C++ 开发者
2C++的程序的构成和书写形式
2C++的程序的构成和书写形式
51 2
|
8月前
|
SQL
将查询出来数据中相对应的字段根据枚举类更改为其中文内容
将查询出来数据中相对应的字段根据枚举类更改为其中文内容
在案例demo 里超过100条数据代码怎么写
在案例demo 里超过100条数据代码怎么写
53 1
【TP5】在模板里边输出if写法
【TP5】在模板里边输出if写法
257 0
【TP5】在模板里边输出if写法
|
JSON 前端开发 数据格式
前端(二十一):label语句、with语句、JSON、生成器、解析赋值、历史状态管理、将页面可编辑
label语句、with语句、JSON、生成器、解析赋值、历史状态管理、将页面可编辑
163 0
|
XML 编解码 API
什么是 SVG?本项目简单分享动画入门的相关知识,并附有相关代码演示,同时文档对SVG等相关内容有比较详细的叙述,如vector标签中属性所代表的意义解释、path标签所支持的指令解释等等。
什么是 SVG?本项目简单分享动画入门的相关知识,并附有相关代码演示,同时文档对SVG等相关内容有比较详细的叙述,如vector标签中属性所代表的意义解释、path标签所支持的指令解释等等。
138 0
什么是 SVG?本项目简单分享动画入门的相关知识,并附有相关代码演示,同时文档对SVG等相关内容有比较详细的叙述,如vector标签中属性所代表的意义解释、path标签所支持的指令解释等等。
|
前端开发 开发者
评论列表案例-演示艾特符号替代相对路径的好处|学习笔记
快速学习评论列表案例-演示艾特符号替代相对路径的好处
464 0
|
JavaScript 网络架构
ES6知识点补充——剩余参数、展开语法
JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来了解剩余参数、展开语法
198 0
|
Java Spring
Springboot 同一次调用日志怎么用ID串起来,方便最终查找
Springboot 同一次调用日志怎么用ID串起来,方便最终查找
472 0
Springboot 同一次调用日志怎么用ID串起来,方便最终查找
|
XML 存储 Java
编写Java程序,使用 dom4j 解析上一节王者荣耀“英雄”对应的Xml文件数据内容,打印输出,具体格式
编写Java程序,使用 dom4j 解析上一节王者荣耀“英雄”对应的Xml文件数据内容,打印输出,具体格式
238 0
编写Java程序,使用 dom4j 解析上一节王者荣耀“英雄”对应的Xml文件数据内容,打印输出,具体格式