xpath 怎样选取某个节点但是排除掉某个子节点

不用text()函数,臣妾做不到呀~
采集数据的话,推荐你试试小八,小八可以直接将网页源码采集下来,内置正则等格式化工具,直接格式化掉B标签内容,就不用那么痛苦的写XPATH啦~

■网友
from lxml import htmltext = \u0026#39;\u0026#39;\u0026#39; \u0026lt;a class="only"\u0026gt; \u0026lt;b class="b1"\u0026gt;aaaaa\u0026lt;/b\u0026gt; \u0026lt;p\u0026gt;xxx\u0026lt;/p\u0026gt; \u0026lt;p\u0026gt;xxx\u0026lt;/p\u0026gt; \u0026lt;/a\u0026gt;\u0026#39;\u0026#39;\u0026#39;tree = html.fromstring(text)tree.xpath(\u0026#39;//a//text()\u0026#39;)
out:

不懂为什么不可以用text(), 提取文本只能用text()和string函数, string函数提取的是所有文本合并起来的, 无法筛选, 只能用text().
问题一: 如何获得一个字符串而不是列表
在Xpath中, location path(也就是我们常见的/a/c)返回值都是一个列表(node-set)
如果你需要返回一个字符串, 那么你需要使用文本函数(string())以及其衍生函数.
首先说明一下文本函数的原理:
我们的Xpath返回一个列表(node-set), 文本函数取列表中的第一个值作为参数, 然后返回一个字符串, 当这个参数是一个标签节点时, 这个函数会把其所有的文本节点都拼接起来并返回. 这就是问题所在, 这个函数只能拼接文本, 但是无法选择你要拼接的文本是哪些, 所以你没办法用这个函数完成拼接+过滤的任务.
问题二:
from lxml import htmltext = \u0026#39;\u0026#39;\u0026#39; \u0026lt;a\u0026gt; \u0026lt;b\u0026gt;xxx\u0026lt;/b\u0026gt; ssss\u0026lt;a\u0026gt;\u0026#39;\u0026#39;\u0026#39;tree = html.fromstring(text)tree.xpath(\u0026#39;//a/text()\u0026#39;)
只需要获取ssss的话, 你需要知道child和descend的关系, ssss是a标签的child, xxx是a标签的descend.
至于这两个的区别可以参考我的这篇文章:
【xpath 怎样选取某个节点但是排除掉某个子节点】 专栏


    推荐阅读