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

我正在尝试学习xpath。 我查看了这里的其他contains()例子,但没有使用AND运算符。 我无法得到这个工作:

//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> ... 

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

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

这个查询会给你带有一个包含文本'Model'一个或多个li子元素的featureList class的元素。

我已经给杰夫·耶茨的解决scheme+1了。

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

  // ul [@ class ='featureList'并包含(li,'Model')] 

遇到contains()函数(或XPath中的任何其他string函数)的限制。

第一个参数应该是一个string。 如果你给它一个节点列表(给它“ li ”这样做),一个string转换必须发生。 但是这个转换只对列表中的第一个节点完成。

在你的情况下,列表中的第一个节点是<li><b>Type:</b> Clip Fan</li> (转换为string:“ Type: Clip Fan

  // ul [@ class ='featureList'并包含(li,'Type')] 

实际上会select一个节点!

这是一个关于关于contains()在XPath中常见误解的老问题的新答案…

小结: contains()表示包含一个子串 包含一个节点

详细说明

这个XPath经常被误解:

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

错误的解释:select那些包含一个li元素和Model ul元素。

这是错误的,因为

  1. contains(x,y)期望x是一个string,和
  2. 将多个元素转换为string的XPath规则是这样的 :

    通过返回首先按照文档顺序的节点集中的节点的string值 ,将节点集转换为string。 如果节点集为空,则返回空string。

正确的解释:select那些第一个 li孩子有一个包含 Model子串的string值的 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')]selectone ul元素。

    注: two ul元素没有被选中,因为two ul的第一个li子元素的string值是Foo ,它不包含Model子string。

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

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

也可以看看

  • 在XPath中testingtext()节点与string值

在这里粘贴我contains例子:

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