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

これにより、ヘッダーブロックではない内のすべての<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 に答える