Xpath 查找所有前面的同级节点,直到找到具有特定子节点属性的节点为止

Xpath 查找所有前面的同级节点,直到找到具有特定子节点属性的节点为止,xpath,Xpath,我希望获取特定行标识符(行列上的属性)之后的所有表行,直到找到该特定行标识符为止 以下是我试图解析的html: <tr> <td colspan="4"> <h3>Header 1</h3> </td> </tr> <tr> <td>Item desc - Header 1</td> <td>more info</t

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

以下是我试图解析的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
项目说明-标题1
更多信息
30
500
标题2
项目说明-标题2
其他
4.
49
项目2说明-标题2
其他2
65
87
我希望能够抓住标题1下的项目,并在找到标题2时停止;然后检查标题2下的项目,并在找到标题3时停止;等等


这在xpath下可能吗?我无法让它只找到TR节点,直到它找到具有特定属性(colspan=“4”)的子节点

这在XPath 1.0下是不可能的。您必须以某种方式修复头tr,因为您正试图找到其所有后续同级,它们的前一个头tr是原始头tr。没有对原始标题的引用,一切都是可能的。但是你可能使用某种语言,你可以用它来记住价值

例如,在:

输出:

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[not(child::h3/text()='Header 1')]/祖先::tr

或更一般的:

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

那么您只需要每个头下的所有节点?
//*/tr/td[not(child::h3)]/ancestor::tr