识别相对于祖父母的位置上的节点

时间:2014-12-12 16:07:42

标签: html r xpath

我有以下HTML表格:

tab2 <- '<table>

<thead>
<tr>
<th rowspan="2">a</th>
<th>b</th>
<th colspan="2" rowspan="2">c</th>
</tr>
<tr>
<td></td>
</tr>
</thead>

<tbody>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
<td></td>
</tr>
</tbody>

</table>'

它有三行,前两行是标题信息,最后一行是正文。目标是仅使用相对于表节点(1 + 2)的标题行位置来提取标题信息,即不必注意标题节点是否具有父节点。

我试过

//tr[position() < 3]

不起作用,因为position()相对于父节点thead和tbody起作用。

我正在使用R与XML包(使用XPath 1.0)。这是我在上面使用XPath

时得到的结果
xpathSApply(tab2, "//tr[position() < 3]")

[[1]]
<tr><th rowspan="2">a</th>
<th>b</th>
<th colspan="2" rowspan="2">c</th>
</tr> 

[[2]]
<tr><td/>
</tr> 

[[3]]
<tr><td>1</td>
<td>2</td>
<td>3</td>
<td/>
</tr> 

我得到了所有三行。根据我对position()的理解,这是有道理的。它相对于其父级工作。

上下文

我正在编写一个函数,允许用户使用R编程语言解析HTML表并从中汇编R数据结构。该函数允许用户传递一个数值,其中行提供标题信息和哪些正文信息。对于上表,用户应该能够说第1行和第2行(在整个表中)提供标题信息。我需要处理此输入,以便它可以在HTML表无条件上处理此表是否使用thead和tbody元素。

的问题

// tr [position()&lt; 3]

是它还返回正文行(第三行)。希望这表明(呃)。

2 个答案:

答案 0 :(得分:1)

使用以下XPath表达式:

/table//tr[count(preceding::tr) < 2]

不关心某个tr是否在thead内。它只考虑{0}前面有零个或另一个tr元素的tr元素。结果如下:

<tr>
<th rowspan="2">a</th>
<th>b</th>
<th colspan="2" rowspan="2">c</th>
</tr>
-----------------------
<tr>
<td/>
</tr>

警告:这种简单方法仅在HTML文档中只有一个表时才有效。但只要您正在使用这个HTML代码段,就足够了。

答案 1 :(得分:0)

此表达式适用于包含任意数量表的文档。

//table/descendant::tr[position() < 3]

通过使用descendant前向轴,[position() < 3]下标将选择表格tr后代集合中的第一个和第二个节点(而不是找到它们相对于它们的位置)父节点,与问题中的//tr一样。)

http://jsfiddle.net/uutavwvk/1/