找到所有前面的兄弟姐妹节点,直到发现一个特定的子节点属性为止



我想在特定的行标识符(行上的属性)之后获取所有表行,直到找到该特定行标识符为止。

这是我要解析的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

相关内容

最新更新