我正在解析包含如下结构的网页:
<tr>
<td>Label 1</td>
<td>Label 2</td>
<td>Label 3</td>
<td>Something else</td>
<\tr>
<tr>
<td>Item 1</td>
<td>Item 2</td>
<td>Item 3</td>
<\tr>
我需要做的是根据它的标签选择一个项目,所以我的想法是如果标签位于其行的第3个标签中,我可以抓住下一行中的第3个标签来查找该项目。我无法想办法以这种方式使用position()函数,也许xpath(1.0)无法处理这种类型的过滤。
到目前为止,我最好的尝试是://td[ancestor::tr[1]/preceding-sibling::tr[1]/td[position()]]
。我希望position()函数可以在xpath开头抓取<td>
的位置,因为xpath的其余部分是该节点的过滤器。
我正在尝试做什么?
答案 0 :(得分:6)
您走在正确的轨道上 - 是的,您可以将position()
与count()
一起使用。
选择给定Item 2
的文字Label 2
:
//td[. = 'Label 2']/../following-sibling::tr/td[position() = count(//td[. = 'Label 2']/preceding-sibling::td)+1]/text()
说明:选择第n个单元格,其中 n 由具有所需标签的单元格之前存在的兄弟单元格数给出在上一行。实际上,使用count()
函数确定标签行中的位置,然后通过匹配其position()
来选择下一行中的相应单元格。