这两个XPath表达式有何不同?

时间:2017-06-07 23:48:18

标签: xpath web-scraping

我正在使用XPath解析网站。我有两个查询,一个查找我正在寻找的节点:

//td[.//text()[contains(., "Date Filed:")]]

并且没有:

//td[contains(.//text(), "Date Filed:")]

我不明白这些是如何不同的。我将它们都读作是指"查找具有包含td的后代文本节点的Date Filed个节点。"

有谁可以解释这些有何不同?

这是HTML,虽然我不认为它与问题相关:

<td width="40%" valign="top">
    <br><br><br><br><br>
    <b>Date Filed:</b> 11/13/2008<br>
    <b>Jury Demand: </b> No<br><br>
    <br><b>Date Terminated: </b><br>
    <br><b>Date Reopened: </b><br>
    <br><b>Does this action raise an issue of constitutionality?: </b>Y<br>
</td>

(不要那样看着我。我没有制作网站,美国政府没有。)

2 个答案:

答案 0 :(得分:2)

这就是字符串转换在XPath中的工作方式:
在第二个查询contains(.//text(), "Date Filed:")中,您调用contains函数。它接受两个类型为string的参数,第一个参数.//text()node-set数据类型,这意味着string函数在内部被调用以将节点列表转换为string。在这种情况下,string(.//text())仅返回第一个文本节点。如果您将第二个查询更改为://td[contains(., "Date Filed:")],则会选择所需的td

答案 1 :(得分:0)

在XPath 1.0中,如果将节点集提供给需要字符串的函数contains(),则它使用节点集中第一个节点的字符串值(按文档顺序)。 / p>

在XPath 2.0及更高版本中,如果将节点集提供给需要字符串的函数contains(),则节点集将被雾化,如果结果包含多个字符串(将通常情况下,如果选择了多个节点),则会出现类型错误XPTY0004。

当您在StackOverflow上询问有关XSLT或XPath的问题时,请始终说出您正在讨论的版本。