4

我在 2 个不同的表中有 2 个相同的 td 出现。

我可以使用以下方法获得第一个值“是”:

//h:td[1][*[contains(.,'Loudspeaker')]]/../h:td[last()]/text()

但没有得到第二个值“声音 75dB / 噪音 66dB / 铃声 75dB”。我试过:

//h:td[2][*[contains(.,'Loudspeaker')]]/../h:td[last()]/text()

我对 html 和 xpath 很陌生,所以请多多包涵。

我的html的一部分:

</table><table cellspacing="0">
<tr>
<th rowspan="3" scope="row">Sound</th>
<td class="ttl"><a href="glossary.php3?term=call-alerts">Alert types</a></td>
<td class="nfo">Vibration; MP3, WAV ringtones</td>
    </tr>

<tr>
<td class="ttl"><a href="glossary.php3?term=loudspeaker">Loudspeaker</a> </td>
<td class="nfo">Yes</td>
</tr>

. .

<table cellspacing="0">
<tr>
<th rowspan="5" scope="row">Tests</th>
<td class="ttl"><a href="xyz.php">Display</a></td>
<td class="nfo">
<a class="noUnd" href="http://xyz.php">Contrast ratio: Infinite (nominal) / 3.419:1     (sunlight)</a></td>
</tr><tr>

<td class="ttl"><a href="xyz.php">Loudspeaker</a></td>
<td class="nfo">
<a class="noUnd" href="http://xyz.php">Voice 75dB / Noise 66dB / Ring 75dB</a></td>
</tr><tr>

..

提前致谢。

4

3 回答 3

3

这两个片段之间的唯一区别是,在第二个片段中,您的文本嵌套在一个a元素中。所以它必须是

//h:td[2][*[contains(.,'Loudspeaker')]]/../h:td[last()]/h:a/text()

(我猜你有一个命名空间定义,h因为你在 XPath 中使用它。

于 2013-05-24T10:21:58.923 回答
1

你正在做的是:

//h:td[2]在整个文档中找到每一秒 td (这里的主要问题,因为没有第二个带有文本 "Loudspeaker" 的 td )。
[*[contains(.,'Loudspeaker')]]检查此(第二个 td)是否有一个带有文本扬声器的孩子。
/../h:td[last()]/text() 从父级获取最后一个 td 的文本。

但是您似乎要做的是:
(//h:tr[h:td/*[contains(.,'Loudspeaker')]])查找所有带有文本“扬声器”的tr, [2]选择此trs中的第二个。
/h:td[last()]/. 找到 tr 的第二个最后 td 的任何子项的文本。

因此尝试(未测试!):

(//h:tr[h:td/*[contains(.,'Loudspeaker')]])[2]/h:td[last()]/.
于 2013-05-24T10:38:26.870 回答
0
  public string FindElementUsingOneTrTwoTd(string tblName, string className, string searchString)
    {
        return "//*[@id=\"" + tblName + "\"]/tbody/tr/td[contains(normalize-space(@class), \"" + className + "\") and contains(string(),\"" + searchString + "\")]/../td[2]";
    }
于 2020-07-15T10:56:08.753 回答