我想从td
标签中识别出一个文本“My Portal”的元素。下面是我的HTML
<tbody>
<tr>
<td>
<!-- rendered always true, custom column names are also label -->
My Portal
<!-- rendered always false, this feature is not required -->
</td>
</tr>
</tbody>
我在xpath
下方尝试过,如下所示,但没有一个有效:
1. .//td[text()="My Portal"]
2. .//td[contains(text(),"My Portal")]
在互联网上进行一些搜索后,我找到了normalize-space()
方法,该方法将删除尾随和不必要的空格。我使用下面的xpath尝试了这个方法
.//td[normalize-space()="My Portal"]
能够识别元素,但在firebug中它显示为2个匹配的节点。请在萤火虫中找到突出显示元素的附件 我的问题是:
.//td[contains(text(),"My Portal")]
不起作用?有人可以帮忙吗?
答案 0 :(得分:1)
要唯一标识第二个td,您需要做的是添加一个额外的过滤器。因此,如果您查看突出显示的2个标记之间的差异,则父级有一个类而子级没有。所以如果你需要第二个td,那么xpath将是// td [normalize-space()='My Portal'而不是(@ class ='rich-table-cell')]
如果您需要父母,那么:// td [normalize-space()='My Portal'和@ class ='rich-table-cell']
答案 1 :(得分:1)
有几种解决方案。一种有效的方法是指定从根节点到所需td
的确切路径。像
/html/body/table/tbody/tr/td/table/tbody/tr/td[normalize-space()='My Portal']
如果您知道嵌套表不超过两个,则可以将其缩短为
//td//td[normalize-space()='My Portal']
如果您希望最内层表中的td
与表结构无关,请尝试
//td[not(.//table) and normalize-space()='My Portal']
但这并不是非常有效。如果您知道文本&#34;我的门户&#34;出现在td
的直接文本子项中,请尝试
//td[text()[normalize-space()='My Portal']]
答案 2 :(得分:0)
而不是使用text()
尝试.
.//td[contains(.,"My Portal")]
答案 3 :(得分:0)
回答你的问题:
1-因为您正在使用全局选择器“//”,使用此选择器XPAth将在树中找到所有元素,因此如果您只想选择一个td,您应该指定路径,类似这样
/table/tbody/table/td[contains(text(),"My Portal")]
2-您正在使用它的命令应该可以工作,我已经尝试过,再次检查您的路径,也许您没有选择他的父母,或者您是从错误的路径开始。
function xpath(){
var input = document.getElementById("xpath").value
var cell = document.evaluate( input, document, null, XPathResult.ANY_TYPE, null );
var cellvalue = cell.iterateNext();
console.log(cellvalue);
alert(cellvalue.data);
};
<html>
<head>
</head>
<body>
<input type="text" id="xpath" value='//body/table/tbody/tr/td/table//td[contains(text(),"My Value")]/text()'/> <input type="button" onclick="xpath()" value="Execute"/>
<table>
<tbody>
<tr>
<td>
<table>
<tbody>
<tr>
<td>
My Value
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</body>
</html>