1

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

这是我要解析的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下吗?在找到具有特定属性(colspan =“4”)的子节点之前,我无法让它只找到 TR 节点。

4

2 回答 2

1

这可能会给你你正在寻找的东西,而不是最正统的手段:

//*/tr/td[not(child::h3)]/ancestor::tr

这将为您提供a中不是标题块的所有<td>节点。<tr>

您可以指定标题:

//*/tr/td[not(child::h3/text()='Header 1')]/ancestor::tr

或者更一般的:

//*/tr/td[not(child::h3[contains(text(),'Header')])]/ancestor::tr

于 2012-11-02T18:19:05.043 回答
1

这在 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
于 2012-11-02T16:53:46.233 回答