BeautifulSoup使用XPath提取【不包含/除外】的内容

发表时间:2020-02-27

假设有这样一段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再进行清洗。最终效果如下图所示:

微配音

文章来源互联网,尊重作者原创,如有侵权,请联系管理员删除。邮箱:417803890@qq.com / QQ:417803890


Python Free

邮箱:417803890@qq.com
QQ:417803890

皖ICP备19001818号
© 2019 copyright www.pythonf.cn - All rights reserved

微信扫一扫关注公众号:

联系方式

Python Free