XHTMLドキュメントがあり、その中のclass="index"を持つ唯一のテーブルを選択したいと思います。
私が正しく理解していれば、子孫軸は現在のノードから直接および間接的にすべてのノードを選択するので、これが私が得たものです。
//descendant::table[@class="index"]
xmlstarletでテストした場合、機能していないようです。ツールが壊れていませんか、それともXPath式が間違っていますか?
XHTMLドキュメントがあり、その中のclass="index"を持つ唯一のテーブルを選択したいと思います。
私が正しく理解していれば、子孫軸は現在のノードから直接および間接的にすべてのノードを選択するので、これが私が得たものです。
//descendant::table[@class="index"]
xmlstarletでテストした場合、機能していないようです。ツールが壊れていませんか、それともXPath式が間違っていますか?
私//table[@class="index"]
はあなたが望むものだと思います
サンプルページ(metacritic.com/film/highscores.shtml)に基づいて、次を使用する必要があると思います。
//TABLE[@CLASS="index"]
(or /descendant::TABLE[@CLASS="index"])
これは、CLASSインデックスを持つTABLEがサンプルページで大文字で記述されているためです(XMLとXPathでは大文字と小文字が区別されます)。
これは、特定のページをターゲットにしている場合は機能しますが、異なるページが同じhtmlタグに対して異なる大文字と小文字を使用している場合はおそらく問題になります。
次に、次のような忌まわしきものが必要になります
//TABLE[@CLASS="index" or @class="index" or @Class="index" or ...]
|//table[@CLASS="index" or @class="index" or ...]
|...
したがって、情報を抽出する前にTidyを使い続けるか、(XPathではなく)HTMLスクレイピングに特化したツールに切り替える必要があります。
はい、descendant
軸はコンテキスト ノードの下位にあるすべてのノードを選択します。しかし、ここで重要なのはコンテキスト ノードです。
たとえば、現在のノードのすべての子孫をdescendant::span
取得します。span
同様descendant::*
に、現在のノードのすべての子孫要素を取得します。
テーブルと子を一致させる必要がある場合、提供した XPath は私のテスト中に正常に動作します。
//descendant::table[@class="index"]
... テーブル自体と子ノードを選択します。
テーブルの子のみを照合する必要がある場合は、まず必要なノードを照合し、次にその子孫を照合します。
//table[@class="index"]/descendant::*
.. テーブルの子ノードのみを選択します。
このコードを使用してください
let $info :=($p//descendant::TABLE[@class="index"])
return $info