前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一日一技:XPath『不包含』应该怎么写?

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

作者头像
青南
发布2019-08-13 14:16:52
3.4K0
发布2019-08-13 14:16:52
举报
文章被收录于专栏:未闻Code未闻Code

摄影:产品经理

厨师:kingname

假设有这样一段HTML代码:

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

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

如果我们把XPath写成:

代码语言:javascript
复制
//div[@class="post"]/text()

运行效果如下图所示:

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

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

代码语言:javascript
复制
//div[@class="post"]//text()

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

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

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

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

代码语言:javascript
复制
//div[@class="post"]//*[not(@class="quote")]/text()

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

运行效果如下图所示:

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

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

代码语言:javascript
复制
//div[@class="post"]/text() | //div[@class="post"]//*[not(@class="quote")]/text()

运行效果如下图所示:

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档