使用text()检索包含特定文本的xpath文本

32

我已经花了几个小时努力解决这个问题,但是我还是无法弄清楚。使用XPath查找文本值是棘手的,而且这个问题有太多复杂的部分。

我有一个包含大型表格的网页,其中一个部分包含分配给特定单位的用户(受让人)列表。几乎总是有多个用户被分配到一个单位,我需要确保特定用户被分配到表格上的任何一个单位。我已经几乎全部使用XPath选择器,并且在这个问题上已经完成了一半。我只是似乎无法弄清楚如何在这种情况下使用containstext()

以下是我目前的进展:

//td[@id='unit']/span [text()='asdfasdfasdfasdfasdf (Primary); asdfasdfasdfasdfasdf, asdfasdfasdfasdf; 456, 3456'; testuser]
上面的XPath查询捕获了我要查看的特定部分中的所有文本,这很好。但是,我只需要知道testuser是否在该部分中。
1个回答

83

text() 可以获取一组文本节点。我倾向于在 //span//text() 等上下文中更多地使用它。

如果您想检查元素内的文本是否包含某些内容,应该在元素上使用 contains 而不是 text() 的结果,像这样:

span[contains(., 'testuser')]

XPath在上下文方面表现很好。如果您确切知道一个节点应该具有什么文本,您可以执行以下操作:
span[.='full text in this span']

但是如果你想要做一些像正则表达式(例如使用exslt)的东西,你需要使用string()函数:

span[regexp:test(string(.), 'testuser')]

6
contains(., 'testuser')中的点号代表当前上下文节点,即要搜索包含文本的节点。 - supertonsky
12
span[contains(., 'testuser')]中的点是一个span节点...在谓词(方括号)内,您可以编写相对于正在评估谓词的节点的xpath表达式。因此,span[contains(., 'testuser')]会评估span节点上的[]谓词,并检查自身是否包含文本“testuser”...或者,span[contains(./span,'testuser')]测试将检查跨越嵌套span的span,如果内部span包含'testuser',则匹配外部span...这就像目录路径一样。 - underrun
正则表达式中的matches(...)函数怎么样? - Ahmad
为什么我们不能使用表达式 //span[contains(text(), 'testuser')] 来查找包含单词 testuser 的 span 元素呢? - Jinlxz Liu

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