3

指定された id、つまり 22 と 222 を持つ div の子孫の中からすべての秒の tds を見つけようとします。私の頭に浮かぶ最初の解決策は次のとおりです。

//div[@id='indicator']//td[2]

ただし、最初のテーブル セル、つまり 22 のみが選択されますが、22 と 222 の両方は選択されません。次に、// を /descendant-or-self::node()/ に置き換えて、同じ結果を得ました (明らかに)。しかし、「-or-self」を削除すると、xpath 式が期待どおりに機能し始めました

 test1 = test_tree.xpath(u"//div[@id='indicator']/descendant-or-self::node()/td[2]")
 print len(test1) #prints 1 (first one: 22)

 test1 = test_tree.xpath(u"//div[@id='indicator']/descendant::node()/td[2]")
 print len(test1) #prints 2 (22 and 222)

ここにテストHTMLがあります

<html>
    <body>
        <div id='indicator'>
            <table>
               <tbody>
                    <tr>
                        <th>1</th>
                        <th>2</th>
                        <th>3</th>
                    </tr>
                    <tr>
                        <td>11</td>
                        <td>22</td>
                        <td>33</td>
                    </tr>
                    <tr>
                        <td>111</td>
                        <td>222</td>
                        <td>333</td>
                    </tr>
                </tbody>
            </table>
        </div>
    </body>
</html>

div が含まれているかどうかに関係なく、すべての tds が div 要素の子孫であるため、両方の式が同じように機能しないのはなぜでしょうか。

4

3 に答える 3

0

質問で提供された HTML を含む Web ページを開発しました。

この xpath を使用する場合:

.//div[@id='indicator']//tr/td[2]

期待どおりに動作し、結果は次のとおりです。

[u'<td>22</td>', u'<td>222</td>']

ただし、コメントによると、.//td[2]いつ機能しないかを尋ねていました。その理由は、DOM 内のすべての td(s) のリスト.//tdを提供するためです。のようなインデックスを追加すると、そのリストの 2 番目の td になります[2]

要約すると、これらはそれぞれと を適用.//tdした結果です。.//td[2]

ここに画像の説明を入力

これらの tds 内のテキストを取得する場合は/text()、次のように追加する必要があります。

ここに画像の説明を入力

アップデート:

OPは言った:

So why then //div[@id='indicator']/descendant::node()/td[2] produces ['22', '222']? According to your comment: "Adding an index such as [2] will result in the second td in that list" it should populate only ['22'].

ここで何が起こっているのかを説明しようとします:

  1. descendant:node()等しくない//
  2. 等しいの//は次のとおりです。descendant-or-self::node()
  3. W3C仕様で説明されています:

ここに画像の説明を入力

このコードが役立つことを願っています: ここに画像の説明を入力

于 2015-07-29T18:50:52.213 に答える
0

この問題の原因を見つけたと思います:

http://www.w3.org/TR/xpath20/#id-errors-and-opt

「場合によっては、プロセッサは、正式な式のセマンティクスによって暗示されるすべてのデータにアクセスすることなく、式の結果を判断できます。たとえば、フィルター式の正式な説明は、$s[1]すべての項目を順番に調べることによって評価する必要があることを示唆しています。 $s、および述語 を満たすすべてのものを選択しposition()=1ます。実際には、多くの実装は、シーケンスの最初の項目を取得してから終了することで、この式を評価できることを認識します。」

したがって、救済策はありません。xpath プロセッサの実装に依存しますが、その理由はまだ理解できず//div[@id='indicator']/descendant-or-self::node()/td[2]//div[@id='indicator']/descendant::node()/td[2]異なる結果が生成されます。

于 2015-07-30T09:27:53.390 に答える