使用XPath选择表中标题后面的所有行

时间:2014-07-28 20:15:23

标签: xpath

我很难搞清楚如何做一些看似非常简单的事情。我们假设我有一个HTML表格,如下所示:

<table><tbody>
  <tr><th>First header</th></tr>
  <tr../>
  <tr../>
  <tr../>
  <tr><th>Second header</th></tr>
  <tr../>
</tbody></table>

我希望所有三行紧跟在&#34; First标题&#34;之后。到目前为止,我有'/table/tbody/tr[preceding-sibling::tr/th[1]/text()="First header"]',但它会在&#34; First标题&#34;之后给我表中的每一行。我做错了什么?

编辑: 我正在处理将标头作为变量传入的代码,因此我在不知道最后是否有另一个标头或它将是什么的情况下解析表。更一般地,给定标题字符串,检索所有后续行,直到表的下一个标题或结尾。

2 个答案:

答案 0 :(得分:1)

您可以获取包含前一兄弟tr text = th且后续兄弟包含First header标记的每个th代码:

//tr[preceding-sibling::tr/th = 'First header' and following-sibling::tr/th]

演示(使用xmllint):

$ xmllint index.html --xpath "//tr[preceding-sibling::tr/th = 'First header' and following-sibling::tr/th]"
<tr>1</tr><tr>2</tr><tr>3</tr>

index.html包含:

<table>
    <tbody>
    <tr>
        <th>First header</th>
    </tr>
    <tr>1</tr>
    <tr>2</tr>
    <tr>3</tr>
    <tr>
        <th>Second header</th>
    </tr>
    <tr>4</tr>
    </tbody>
</table>

答案 1 :(得分:0)

经过更多的试验和错误,我得到了这个: '/table/tbody/tr[preceding-sibling::tr[th/text()="First header"] = preceding-sibling::tr[th][1]]' 转换为英语:获取前面带有“First header”行的所有行,其中该行也是包含标题的第一行。