XPath: 嵌套方括号的含义是什么?

5

我正在学习用XPath进行网络爬取,并偶然发现了这两个XPath示例:

//div[@class="head"][@id="top"]

以及

//div[@class='canvas- graph']//a[@href='/accounting.html'][i[@class='icon-usd']]/following-sibling::h4

我想知道 div[@class="head"][@id="top"] 表示什么意思。它是指 @id=top 属性属于 div 元素吗?这与 //div[@class="head" and @id="top"] 相同吗?
当方括号像第二个示例中嵌套在另一个方括号中时,它表示什么意思? 第二个XPath表达式所匹配的HTML DOM会是什么样子?

2个回答

11

方括号包围谓词,而谓词用于筛选项††

您预期可以通过两种方式组合谓词:

  1. 连续组合:是的,这相当于在逻辑上进行了运算。因此,正确的//div[@class="head"][@id="top"]等同于//div[@class="head" and @id="top"]

  2. 递归组合:是的,XPath允许在谓词内使用谓词(如您所观察到的,称为嵌套)。

    因此,a[@href='/accounting.html'][i[@class='icon-usd']]会过滤掉那些具有@href属性值等于'/accounting.html'并且有一个子元素i,其@class属性值为'icon-usd'a元素。

这些组合机制一起提供了一种强大的方式,用更基本的条件构建谓词。


谓词参考:XPath 1.0XPath 3.1
†† 在XPath 1.0中为节点集;在XPath 2.0+中为序列


1
方括号被称为predicate
谓语根据轴筛选节点集以生成新的节点集。对于要筛选的节点集中的每个节点,PredicateExpr将使用该节点作为上下文节点进行评估,使用节点集中的节点数作为上下文大小,并使用节点在相对于轴的节点集中的接近位置作为上下文位置;如果PredicateExpr对该节点求值为true,则将该节点包括在新的节点集中;否则,它不包括在内。
通过评估Expr并将结果转换为布尔值来评估PredicateExpr。如果结果是数字,则如果数字等于上下文位置,则将结果转换为true,否则将转换为false;如果结果不是数字,则将结果转换为boolean函数的调用方式。因此,位置路径para [3]等同于para [position()= 3]。
在谓词内,你可以通过测试条件是否为真或假来过滤左边所选项的集合。可以将其视为SQL中的WHERE子句。您可以选择在单个谓词中放置多个测试条件,也可以使用多个谓词。从调优的角度或为了清晰起见,选择使用多个谓词可能会更有利于使用and和单个谓词中的多个测试。

1
我仍然对嵌套括号感到困惑。这样的表达式是否有效://div[@class="parent" [div[@class="child"]] ],意思是匹配具有class属性等于parentdiv元素,并且该元素具有一个子节点div,其class属性等于child - blablaalb
2
你的想法是正确的,但是那个XPath语句是不正确和无效的。你可以使用://div[@class="parent" and div[@class="child"]] 或者 //div[@class="parent"][div[@class="child"]] - Mads Hansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接