2009-05-19 15 views
2

私はXHTML文書を持っていますが、class = "index"でその中の唯一のテーブルを選択したいと思います。XPathで特定のテーブルを選択する

正しく理解すれば、子孫軸は現在のノードから直接的かつ間接的に降下するすべてのノードを選択します。

//descendant::table[@class="index"] 

xmlstarletでテストしても動作していないようです。私のツールが壊れている、またはXPath式が間違っていますか?

+1

あなたがサンプル入力を投稿する場合、私たちは、ツールが壊れているかどうかを確実に知ることができます。 (たとえば、名前空間の接頭辞を使用する必要があるかもしれません)。簡単なメモ//子孫::は冗長です。この場合、/ descendant :: table(スラッシュは1つだけ)または単に//テーブルを使用します。 "//"は "/ descendant-or-self :: node()/"の省略形です。 –

+0

metacritic.com/film/highscores.shtmlはこのような例の1つですが、Tidyやその他の調整を経なければなりませんXSLT対応。 – jldugger

+0

XHTML名前空間宣言の追加が含まれていますか? XPathでは、名前空間を使用するノードを名前で選択する場合、名前空間を宣言して(式に接頭辞を使用する)必要があります。 –

答えて

2

あなたの例のページ(metacritic.com/film/highscores.shtml)に基づいて、私はあなたが使用する必要が言う:

//TABLE[@CLASS="index"] 
(or /descendant::TABLE[@CLASS="index"]) 

CLASSインデックスを持つテーブルが上の大文字で書かれているためですあなたのサンプルページ(XMLとXPathでは大文字と小文字が区別されます)。

これは特定のページをターゲットにしている場合には機能しますが、異なるページで同じHTMLタグに異なる大文字と小文字を使用すると問題になることがあります。

その後、あなたはあなたがおそらく情報を抽出する前に、Tidyのを使用し続ける、または(代わりのXPathの)スクレーピングHTMLに特化していますツールに切り替える必要があります

//TABLE[@CLASS="index" or @class="index" or @Class="index" or ...] 
|//table[@CLASS="index" or @class="index" or ...] 
|... 

のような醜態をする必要があります

+0

確かに、Tidyはプロセスの一部ですが、tdをフォームの中に置くフォーマットの悪いHTMLの上に乗っています。私はすでにBeautifulSoupとuTidyをベースにしたほぼ動作しているバージョンを手に入れました。私が思う次のステップは、きれいなフォームをきちんとしたやり方で修正する方法を考え出すことです。 – jldugger

3

私は//table[@class="index"]あなたが

1

欲しいものだと思うはい、descendant軸は、コンテキストノードから降順すべてのノードを選択します。しかし、ここでの鍵はコンテキストノードです。

たとえば、descendant::spanは、現在のノードの子孫すべてspanを取得します。同じように、descendant::*は、現在のノードのすべての子孫要素を取得します。

あなたはテーブルだけでなく、子供たちを一致させる必要がある場合は、XPathはあなたが私のテスト中に細かい作品を提供:

//descendant::table[@class="index"] 

を...表自体とのchildNodesを選択します。

あなたが唯一の子孫と一致し、テーブルの子に一致する最初のあなたはをするノードと一致して、する必要がある場合:

//table[@class="index"]/descendant::* 

...は、表の唯一の子ノードを選択します。

0

使用このコード

let $info :=($p//descendant::TABLE[@class="index"]) 
     return $info 
関連する問題