当前位置: 首页 > 面试题库 >

XPath:dot和text()之间的区别

严峰
2023-03-14
问题内容

我的问题是关于使用dot和text()in的细节XPath。例如,以下几find_element行返回相同的元素:

driver.get('http://stackoverflow.com/')

driver.find_element_by_xpath('//a[text()="Ask Question"]')
driver.find_element_by_xpath('//a[.="Ask Question"]')

那么区别是什么呢?使用.和的优点和缺点是text()什么?


问题答案:

.和之间存在差异text(),但是由于您输入的文档,这种差异可能不会浮出水面。

如果您的输入文档看起来像(给定您的XPath表达式可以想象的最简单的文档)

例子1

<html>
  <a>Ask Question</a>
</html>

然后//a[text()="Ask Question"]//a[.="Ask Question"]确实返回完全相同的结果。但是考虑一个看起来像下面的输入文档

例子2

<html>
  <a>Ask Question<other/>
  </a>
</html>

其中该a元素还有一个子元素other,紧接在“问问题”之后。给定第二个输入文档,//a[text()="Ask Question"]仍然返回a元素,而//a[.="Ask Question"]什么都不返回

这是因为两个谓词([和之间的所有内容])的含义都不同。[text()="Ask Question"]实际的意思是:如果元素的任何文本节点都包含恰好包含“问问题”的文本,则返回true。另一方面,[.="Ask Question"]意味着:如果元素的 字符串值 与“问问题”相同,则返回true 。

在XPath模型中,如果其他元素干扰文本,则可以将XML元素内的 文本 划分为多个 文本节点 ,如上面的 示例2
所示。在那里,该other元素介于“问问题”和换行符之间,换行符也视为文本内容。

为了使示例更清晰,请考虑将其作为输入文档:

例子3

<a>Ask Question<other/>more text</a>

在此,a元素实际上包含 两个
文本节点“问问题”和“更多文本”,因为它们都是的直接子代a。您可以通过//a/text()在此文档上运行进行测试,该文档会返回(单个结果以分隔----):

Ask Question
-----------------------
more text

因此,在这种情况下,text()将返回一组单独的节点,同时.在谓词中评估所有文本节点的字符串连接。同样,您可以使用路径表达式测试此声明,该表达式//a[.='Ask Questionmore text']将成功返回a元素。

最后,请记住,某些XPath函数只能将一个字符串作为输入。正如LarsH在评论中指出的那样,如果给这样的XPath函数(例如contains())指定了一系列节点,它将仅处理第
一个 节点,而忽略其余节点。



 类似资料:
  • 问题内容: jQuery的功能和之间有什么区别? 您将在哪里使用另一个? 问题答案: 适用于输入元素(或任何具有value属性的元素?),而不适用于输入元素。 获取输入元素的值- 与类型无关。获取所有匹配元素的innerText(不是HTML): 结果是一个字符串,其中包含所有匹配元素的组合文本内容。此方法对HTML和XML文档均适用。不能在输入元素上使用。对于输入字段文本,请使用val属性。 获

  • 问题内容: 我发现与BeautifulSoup一起使用时有些奇怪,找不到任何文档来支持此操作,所以我想在这里询问。 假设我们有一个这样的标签,我们已经用BS对其进行了解析: 提取数据的官方记录方法是。但是,这为第二个标签提取了NoneType 。所以我尝试了(因为为什么不呢?),它完全按照我的意愿提取了一个空字符串。 但是,我在文档中找不到对此的任何引用,并且担心某些内容会丢失。谁能告诉我这是否可

  • 问题内容: 这个问题已经在这里有了答案 : MySQL中的VARCHAR vs TEXT (3个答案) 3个月前关闭。 当我们在MySQL中创建带有列的表时,我们必须为其设置长度。但是对于类型,我们不必提供长度。 和之间有什么区别? 问题答案: TL; DR 固定的最大大小为65535个字符(您不能限制最大大小) 占用2 + 字节的磁盘空间,其中是存储的字符串的长度。 不能(完全)成为索引的一部分

  • 问题内容: 我想明白之间的差别,只是简单地?功能上有区别吗?据我所知,它们是完全相同的。您是否可以对其中之一进行其他操作? 问题答案: –此属性使您可以为文本指定填充颜色。如果未设置,则将使用该属性进行填充。 是的,它们是相同的,但是如果两者具有不同的值,则它们将优先。 我认为这样做的理由是,您可以在使用时根据需要选择其他颜色,但是如果不可用(因此也不可行),它将优雅地退回到。在某些情况下,您可能

  • 有人能指出两者之间的区别吗?当某人应该在上使用'.get_attribute("innerhtml“)‘时?

  • 问题内容: 我错放了太多次了,我想我一直忘记,因为我不知道两者之间的区别,只是一个给了我我期望的价值,而另一个却没有。 为什么是这样? 问题答案: 是的简写形式(尽管请注意,该表达式只会被计算一次。) 是的,即指定一元的到。 例子: