专栏首页未闻Code一日一技: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再进行清洗。最终效果如下图所示:

本文分享自微信公众号 - 未闻Code(itskingname),作者:kingname

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Bug or Feature?藏在 requests_html 中的陷阱

    在写爬虫的过程中,我们经常使用 XPath 来从 HTML 中提取数据。例如给出下面这个 HTML:

    青南
  • 拒绝想当然,不看文档导致GNE 的隐秘 bug

    今天有一个用户来跟我反馈,GNE 0.1.4 版本在提取澎湃新闻时,只能提取一小部分的内容。

    青南
  • 记住Python变量类型的三种方式

    Python作为一门动态语言,其变量的类型可以自由变化。这个特性提高了代码的开发效率,却也增加了阅读代码和维护代码的难度。

    青南
  • 从零开始学 Web 之 移动Web(七)Bootstrap

    随着Web应用变的越来越复杂,在大量的开发过程中我们发现有许多功能模块非常相似,比如轮播图、分页、选项卡、导航栏等,开发中往往会把这些具有通用性的功能模块进行一...

    Daotin
  • datatables 配套bootstrap样式使用小结(2) ajax篇

    上一篇是介绍一下基本的用法,基本的原理是取出所有的数据,然后调用$.datatables(option)方法格式化,这种方法显然不太科学,所以ajax方式是必须...

    _淡定_
  • 根据select下拉框值判断验证条件

    根据select下拉框值判断当前选中的是哪个区域,并且判断当前选中区域里面的值是否为空,如果为空,则弹出弹框提示,请输入xx区域名称,以下只是一个小demo,随...

    祈澈菇凉
  • JavaWeb——CSS应用实例详解(概述、语法、选择器、属性、用户登录界面实例)

    CSS是用来页面美化与布局控制的,英文全称为Cascading Style Sheets 层叠样式表,层叠:多个样式可以同时作用在同一个html的元素上,同时生...

    Winter_world
  • 老司机读书笔记——Weex学习笔记

    Weex整体上与Vue语法大概一直,基本用法由阿里进行二次封装。以下主要介绍Weex的一些内置组件。

    老司机Wicky
  • Bootstrap基本入门大全

    Bootstrap 是基于 HTML、CSS、JAVASCRIPT的,它简洁灵活,使得 Web 开发更加快捷。 重点的是你要理解这个框架的运行机制,了解了它是怎...

    IMWeb前端团队
  • 提交表单的时候验证手机号码和身份证号码

    需求:在提交表单的时候,验证手机号码和身份证号码,如果不填写手机号码和身份证号码,就无需验证,如果填写手机号码和身份证号码,必须要填写正确的格式,如果不正确,则...

    祈澈菇凉

扫码关注云+社区

领取腾讯云代金券