如何在这里使用 XPath 包含() ?

我在学 XPath。我查看了这里的其他 contains()示例,但没有使用 还有操作符的示例。我没法让这个起作用:

//ul[@class='featureList' and contains(li, 'Model')]

关于:

...
<ul class="featureList">


<li><b>Type:</b> Clip Fan</li><li><b>Feature:</b> Air Moved: 65 ft.
Amps: 1.1
Clip: Grips any surface up to 1.63"
Plug: 3 prong grounded plug on heavy duty model
Usage: Garage, Workshop, Dorm, Work-out room, Deck, Office & more.</li><li><b>Speed Setting:</b> 2 speeds</li><li><b>Color:</b> Black</li><li><b>Power Consumption:</b> 62 W</li><li><b>Height:</b> 14.5"</li><li><b>Width:</b> Grill Diameter: 9.5"</li><li><b>Length:</b> 11.5"</li>


<li><b>Model #: </b>CR1-0081-06</li>
<li><b>Item #: </b>N82E16896817007</li>
<li><b>Return Policy: </b></li>
</ul>
...
560871 次浏览

您只是查看查询中的第一个 li子元素,而不是查找可能包含文本 'Model'的任何 li子元素。您需要的查询如下:

//ul[@class='featureList' and ./li[contains(.,'Model')]]

这个查询将为您提供 classfeatureList的元素,以及包含文本 'Model'的一个或多个 li子元素。

我已经把我的 + 1给了 Jeff Yates 的解决方案。

这里有一个简短的解释为什么你的方法不起作用:

//ul[@class='featureList' and contains(li, 'Model')]

encounters a limitation of the contains() function (or any other string function in XPath, for that matter).

The first argument is supposed to be a string. If you feed it a node list (giving it "li" does that), a conversion to string must take place. But this conversion is done for the first node in the list only.

In your case the first node in the list is <li><b>Type:</b> Clip Fan</li> (converted to a string: "Type: Clip Fan") which means that this:

//ul[@class='featureList' and contains(li, 'Type')]

实际上会选择一个节点!

在这里粘贴我的 contains示例:

//table[contains(@class, "EC_result")]/tbody

这是对关于 XPath 中 contains()常见的误解旧问题的新答案..。

摘要: contains()意味着 包含子字符串没有

详细说明

这个 XPath 经常被误解:

//ul[contains(li, 'Model')]

错误解读: 选择那些 包容li元素中包含 Modelul元素。

这是错误的,因为

  1. contains(x,y)期望 x是一个字符串,并且
  2. 将多个元素转换为字符串的 XPath 规则是 这个:

返回的 字符串值将节点集转换为字符串 节点集中位于 文件命令中第一个的节点 Node-set 为空,则返回空字符串。

正确解释: 选择那些 第一 li子元素具有 < em > < strong > string-value 包含 Model子串的 ul元素。

例子

XML

<r>
<ul id="one">
<li>Model A</li>
<li>Foo</li>
</ul>
<ul id="two">
<li>Foo</li>
<li>Model A</li>
</ul>
</r>

XPath

  • //ul[contains(li, 'Model')]选择 one ul元素。

注意: 没有选择 two ul元素,因为第一个 li子元素的 string-value twoulFoo,它不包含 Model子字符串。

  • //ul[li[contains(.,'Model')]]选择 onetwo ul元素。

注意: 两个 ul元素都被选中,因为 contains()分别应用于每个 li。(因此,避免了棘手的多元素到字符串转换规则。)两个 ul元素都有一个 li子元素,它的字符串值包含 Model子字符串—— li元素的位置不再重要。

参见

//ul[@class="featureList" and li//text()[contains(., "Model")]]