我正在尝试选择表格中的内容,目前有以下表达式
//*[@id='row']/tbody/tr[contains(., 'user2')]/td[contains(., 'user2')]
但是,当用户输入诸如“用户25”时,这显然是一个问题,因为它还包含“用户2”。有人可以帮我修复以下表达式的错误,我试图在这些表达式中完全匹配文本值吗? (现在只是排)
//*[@id='row']/tbody/tr[text()='user2']
我也试过规范化空间,似乎没有工作
//*[@id='row']/tbody/tr[normalize-space(text())='user2']
如果它有帮助,那么页面的html
<table id="row" class="gradientTable">
<td>
user2
</td>
<td>User2</td>
<td>User2</td>
<td>user2@mail.com</td>
<td>2</td>
<td>Student</td></tr>
<tr class="even">
答案 0 :(得分:0)
表达式
//*[@id='row']/tbody/tr[.//text()[normalize-space(.)='user2']]
匹配任何单个后代文本节点具有确切内容<tr>
的任何user2
(在空间规范化之后)。
请注意,这与示例html中的任何内容都不匹配。这个例子似乎被打破了,因为那里只有一个<tr>
,它没有我们可以看到的内容。
你问,“究竟是怎么回事.// text()[]工作”?
.
选择上下文节点(在上例中为tr
元素)。//text()
选择任何作为后代的文本节点(前面提到的tr
元素)。[...]
给出一个谓词“过滤”前面的表达式选择的内容。因此,在这种情况下,它会过滤作为上下文tr
后代的所有文本节点,只保留那些空间规范化文本内容为“user2”的文本节点。tr
的谓词,意味着过滤tr
元素,仅保留至少有一个后代文本节点,其空间规范化文本内容为“user2” 正如迈克尔凯指出的那样,这可能正是您想要的,也可能不是您想要的,具体取决于您是否要匹配包含user2
或b
i
的表格单元格元件。
有人可以帮我修复以下表达式的错误吗? 我试图准确匹配文本值? (现在只是排)
//*[@id='row']/tbody/tr[text()='user2']
此表达式匹配的是具有直接子(非孙子)文本节点的tr
元素,其值正好是“user2”,例如<tr>textNode1<td>...</td>user2</tr>
。由于表格中的文字通常位于td
元素中,而不是直接位于tr
下,因此上述表达式通常不匹配。
//*[@id='row']/tbody/tr[normalize-space(text())='user2']
除了空间规范化之外,这个表达式还会破坏=
比较的一般性。换句话说......先前的XPath表达式询问tr
元素是否具有任何文本节点子元素,其值为user2
;但是这个只询问tr
元素的第一个文本节点子节点是否具有值user2
。
为什么呢?因为normalize-space()
函数将单个字符串值作为其参数。因此,如果您提供text()
作为参数,并且有几个text()
个子节点,那么您将提供节点集(或XPath 2.0中的序列)。通过获取节点集中第一个节点的converted to a string,节点集获得the string-value。
要获得一般比较,通过标准化,您可以使用
//*[@id='row']/tbody/tr[text()[normalize-space(.)='user2']]
(无论如何.
参数是默认的,但我更喜欢将其显式化。)同样,这只适用于tr
的直接子节点的文本节点,所以你可能想要那里的后代轴:
//*[@id='row']/tbody/tr[.//text()[normalize-space(.)='user2']]
答案 1 :(得分:0)
如果您要查找包含确切值“user 2”的表格单元格(td)元素,那么您需要
//*[@id='row']/tbody/tr/td[. = 'user2']
人们经常滥用“包含”,因为他们认为它与上面的英语句子具有相同的含义,“节点包含值”。但这就是XPath中“=”的作用; XPath contains()函数测试节点的内容是否具有等于“user2”的子字符串。
请勿在此处使用text()
。 text()
表达式选择单个文本节点。但是您的内容不一定都是同一文本节点的一部分,例如它可能是"user<b>2</b>"
。