我想在特定的行标识符(行上的属性)之后获取所有表行,直到找到该特定行标识符为止。
这是我要解析的HTML:
<tr>
<td colspan="4">
<h3>Header 1</h3>
</td>
</tr>
<tr>
<td>Item desc - Header 1</td>
<td>more info</td>
<td>30</td>
<td>500</td>
</tr>
<tr>
<td colspan="4">
<h3>Header 2</h3>
</td>
</tr>
<tr>
<td>Item desc - header 2</td>
<td>other</td>
<td>4</td>
<td>49</td>
</tr>
<tr>
<td>Item 2 desc - header 2</td>
<td>other 2</td>
<td>65</td>
<td>87</td>
</tr>
我希望能够在标头1下方抓住该项目并在找到标头2时停止;然后在标头2下的项目找到标头3时停止;等。
在XPath下可能可以吗?我无法找到只能找到TR节点,直到它找到具有特定属性的子节点(colspan =" 4")。
在XPATH 1.0下是不可能的。您必须以某种方式固定标头TR,因为您正在尝试找到所有以下兄弟姐妹的兄弟姐妹,其先前的标题TR 是原始的。没有参考原始标头,一切皆有可能。但是您可能会用某种语言来记住该价值。
例如,在xsh中:
for my $x in //tr[td/@colspan="4"] {
echo ($x/td/h3) ;
for $x/following-sibling::tr[count(td)=4
and preceding-sibling::tr[count(td)=1][1]=$x]
echo " " (td) ;
}
输出:
Header 1
Item desc - Header 1 more info 30 500
Header 2
Item desc - header 2 other 4 49
Item 2 desc - header 2 other 2 65 87
这可能会给您您想要的东西,而不是最正统的含义:
//*/tr/td[not(child::h3)]/ancestor::tr
这将为您提供不是标题块的<tr>
中的所有<td>
节点。
,您可以用:
指定标题 //*/tr/td[not(child::h3/text()='Header 1')]/ancestor::tr
或更一般的:
//*/tr/td[not(child::h3[contains(text(),'Header')])]/ancestor::tr