我很难搞清楚如何做一些看似非常简单的事情。我们假设我有一个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;之后给我表中的每一行。我做错了什么?
编辑: 我正在处理将标头作为变量传入的代码,因此我在不知道最后是否有另一个标头或它将是什么的情况下解析表。更一般地,给定标题字符串,检索所有后续行,直到表的下一个标题或结尾。
答案 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”行的所有行,其中该行也是包含标题的第一行。