0

以前どこかで読んだことがありますが、今はこの問題について説明することができないので、誰かが私を正しい方向に向けることができれば幸いです.

HTML ドキュメントの標準 XPath 用の XPath セレクターを作成しています。簡単な例を以下に示します (バックグラウンドで xalan を使用する HTMLUnit に含まれていますが、任意の XPath プロセッサを使用できます)。

私が実行した場合:

WebClient webClient = ......;
HtmlPage page = webClient.getPage("http://www.slideshare.com/");
System.out.println(page.getByXPath("/html/body/footer/div/div/div[2]/div[4]/ul/li[2]/a[*]/text()"));

[] という応答が返ってきました。ただし、代わりに実行すると (a[ * ] と a[ /* ] に注意してください:

WebClient webClient = ......;
HtmlPage page = webClient.getPage("http://www.slideshare.com/");
System.out.println(page.getByXPath("/html/body/footer/div/div/div[2]/div[4]/ul/li[2]/a[/*]/text()"));

[Developers Section] という応答が返ってきます。

ワイルドカードを引数として追加する位置述語が可能です (つまり [ * ])。ただし、一部のノード/タグ (h1、h2...、p、b、strong などのテキスト ノードと、li または ul などの他の HTML タグで特に気付きました) では、ワイルドカードの前にスラッシュが必要になる場合があります (つまり、[ / * ]) 結果を取得します。

誰かがこれが何を意味するかについての背景を提供してもらえますか? Web または XPath 仕様でこれへの参照を見つけることができません。

4

2 に答える 2

1

「ワイルドカード」を使用する意図が単にaパスの下にあるものを選択することである/html/body/footer/div/div/div[2]/div[4]/ul/li[2]場合、述語はまったく必要ありません。これを行うことができます:

/html/body/footer/div/div/div[2]/div[4]/ul/li[2]/a

これにより、パスの子であるすべての a要素が選択されます/html/body/footer/div/div/div[2]/div[4]/ul/li[2]

于 2013-08-01T09:35:15.020 に答える
0

あなたは何をしようとしているのですか?forの述語は何を使用していますか?

私が知る限り、子ノードa[*]要素で選択しているため(コメントを参照-ありがとう)、子要素がないため失敗しています(同様に、... 、、)。ah1h2pb

比較すると、ルートの下にあるa[/*]任意のものを選択していaます (より正確には、ルートを持つ任意のドキュメントで - 繰り返しますが、コメントを参照してください)。これはすべてのノードに当てはまりますが、まったく無意味です。

私はあなたがちょうど使うべきだと思います/html/body/footer/div/div/div[2]/div[4]/ul/li[2]/a/text()

[更新:] パスは「あいまい」で、複数のものに一致する可能性があり、一連の結果を返します。これを行うために特別なこと ( use など[*]) を行う必要はありません。追加の制約を[...]追加するだけです。それは物事をより具体的にします。物事をあまり具体的にする必要はありません。デフォルトでは、可能な限り一般的です。

于 2013-08-01T03:46:16.673 に答える