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