摄影:产品经理
厨师: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再进行清洗。最终效果如下图所示:
