我有以下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]
是它还返回正文行(第三行)。希望这表明(呃)。
答案 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
一样。)