XPath Select 所有节点但不是“图形”节点

XPath Select all nodes but not `figure` node

我正在使用 scrapy 框架和 python 3.7.9.

Britannica 网站抓取文章

链接如下: link1 link2

我正在使用 XPath //section[@id='ref1'] //descendant::node()/text() 表达式来获取所有文本以及 figure 节点的文本,这些节点可以通过 //figure/descendant::node() 选择。

我想写一个表达式来获取除所有 figure 及其 descendants 之外的所有节点。

这是我尝试过的

//section[@id='ref1'] //descendant::node()[not(@figure[descendant::node()])]

但不工作。

应该这样做:

//section[@id='ref1']//*[not(self::figure)]
//section[@id='ref1']//descendant::node()[not(name()="figure")]

您可以使用 name()

访问标记名

更新:

如果您不想要 figure 的子元素,请使用:

//section[@id='ref1']//descendant::node()[not(name()="figure") and not(ancestor::figure)]

I want to write an expression to get all the nodes except all figure and its descendants.

从问题的文本来看,您实际上想要所有文本节点,它们是section[@id='ref1']的后代除了那些是任何figure元素的后代。

一个选择这些节点的 XPath 表达式是:

//section[@id='ref1']//*[not(self::figure)]/text()