有很多类似的问题,但是我无法找到答案。
假设你有一个这样的 HTML 页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Page title</title>
</head>
<body>
<div id="content">
<table>
<tr>
<td>A</td>
<td>B</td>
<td>C</td>
</tr>
<tr>
<td>D</td>
<td>E</td>
<td>F</td>
</tr>
</table>
</div>
</body>
</html>
并且您想选择<td>
页面上的第二个元素,它是其 parent 的第一个子元素。在这种情况下,它是 element <td>D</td>
。
请注意,此措辞应保持不变,例如,它与选择第二个<tr>
然后选择其第一个子级(导致相同的元素)不同,因为我正在使用的原始页面比这个最小的测试用例复杂得多,并且这种方法在那里行不通。
到目前为止我做了什么:
一个CSS 选择器 #content td:first-child
找到了我A
,D
现在我可以通过 JS ( document.querySelectorAll("query")[1]
) 或在 Java 中选择第二个元素(最后我正在使用这些元素)。但是,使用附加代码来完成可以通过选择器完成的工作是非常不一致的。
同样,我可以使用XPath 表达式:id('content')//td[1]
。它相当于上面的 CSS 选择器。它返回一个节点集,所以我认为这id('content')//td[1][2]
会按我想要的方式工作,但没有运气。
一段时间后,我发现我( id('content')//td[1] )[2]
正在按照我想要的方式工作,所以我就这么做了,并且对此感到非常满意。
尽管如此,我还是很失望地看到我无法执行单个查询来获取我的元素,因此存在一个学术问题:是否有任何其他解决方案,无论是使用 CSS 选择器,还是使用 XPath 表达式我的查询?我错过了什么?可以做到吗?