Xpath 的 //tr/td/a[text()="France"] 显示 3 个匹配项。如何获取 "x" 结果的值?
Xpath's //tr/td/a[text()="France"] shows 3 matches. How to get value of "x" result?
例如有这样一段代码:
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">Ukraine</a>
<span>17.06.15<span>
</td>
</tr>
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">France</a>
<span>17.06.15<span>
</td>
</tr>
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">USA</a>
<span>17.06.15<span>
</td>
</tr>
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">France</a>
<span>10.10.15<span>
</td>
</tr>
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">Germany</a>
<span>17.06.15<span>
</td>
</tr>
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">France</a>
<span>23.12.15<span>
</td>
</tr>
在 Chrome 的开发面板中,这个 xpath //tr/td/a[text()="France"]
显示了 3 个结果。
我找不到获取所需值的方法。
例如,如何获取第二个结果的日期(10.10.15)?
我用 position
、//tr/td/a[text()="France"][position=2]/span/text()
和 //tr/td/a[position(text()="France")][2]/span/text()
等尝试了不同的方法,但没有成功。也许 "position" 不是我需要的?
已编辑:
"France" 在代码中的位置因页面而异。在上面的示例中,现在位置是 2、4、6,但在另一页上它可以是 3、10、15、25、27。如何在不考虑 'France' 实际所在位置的情况下得到第二个结果和最后一个结果?
您的 'xml' 无效,所以我首先更正了它(我知道它无效 HTML 但足以测试):
<?xml version="1.0" encoding="utf-8"?>
<form>
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">France</a>
<span>17.06.15</span>
</td>
</tr>
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">France</a>
<span>10.10.15</span>
</td>
</tr>
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">France</a>
<span>23.12.15</span>
</td>
</tr>
</form>
然后,这成功了:
//tr[position()=2]/td/a[text()="France"]/../span/text()
这是一种可能的方式:
(//tr/td[a='France'])[2]/span/text()
位置索引前的括号是必需的,因为 ([]
) 比 (//
和 /
) * 具有更高的优先级(优先级)。因此,例如,此表达式 //tr/td[a='France'][2]/span/text()
将在单个 tr
父级中查找第二个 td
,而您发布的 HTML 示例中不存在该表达式。
*:关于此事的进一步解释:How to select specified node within Xpath node sets by index with Selenium?
例如有这样一段代码:
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">Ukraine</a>
<span>17.06.15<span>
</td>
</tr>
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">France</a>
<span>17.06.15<span>
</td>
</tr>
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">USA</a>
<span>17.06.15<span>
</td>
</tr>
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">France</a>
<span>10.10.15<span>
</td>
</tr>
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">Germany</a>
<span>17.06.15<span>
</td>
</tr>
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">France</a>
<span>23.12.15<span>
</td>
</tr>
在 Chrome 的开发面板中,这个 xpath //tr/td/a[text()="France"]
显示了 3 个结果。
我找不到获取所需值的方法。
例如,如何获取第二个结果的日期(10.10.15)?
我用 position
、//tr/td/a[text()="France"][position=2]/span/text()
和 //tr/td/a[position(text()="France")][2]/span/text()
等尝试了不同的方法,但没有成功。也许 "position" 不是我需要的?
已编辑: "France" 在代码中的位置因页面而异。在上面的示例中,现在位置是 2、4、6,但在另一页上它可以是 3、10、15、25、27。如何在不考虑 'France' 实际所在位置的情况下得到第二个结果和最后一个结果?
您的 'xml' 无效,所以我首先更正了它(我知道它无效 HTML 但足以测试):
<?xml version="1.0" encoding="utf-8"?>
<form>
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">France</a>
<span>17.06.15</span>
</td>
</tr>
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">France</a>
<span>10.10.15</span>
</td>
</tr>
<tr>
<td width="270" class="news">
<a href="/lists/test_acc/1/" class="all">France</a>
<span>23.12.15</span>
</td>
</tr>
</form>
然后,这成功了:
//tr[position()=2]/td/a[text()="France"]/../span/text()
这是一种可能的方式:
(//tr/td[a='France'])[2]/span/text()
位置索引前的括号是必需的,因为 ([]
) 比 (//
和 /
) * 具有更高的优先级(优先级)。因此,例如,此表达式 //tr/td[a='France'][2]/span/text()
将在单个 tr
父级中查找第二个 td
,而您发布的 HTML 示例中不存在该表达式。
*:关于此事的进一步解释:How to select specified node within Xpath node sets by index with Selenium?