4

XPath を使用して、約 10 レベルの深さの整形式でない HTML を含むテンプレート内のノード (またはそれに近いもの) を見つけます。(いいえ、私はこの HTML を書きませんでした...しかし、私はそれを掘り下げる任務を負っています。)

Firefox 用の XPartner アドオンを使用して、問題の要素への XPath を取得できるようです。ただし、提供されたテンプレートではなく、ライブ サイトの場所のみが表示されます。(テンプレートは非標準のサーバー側スクリプト言語からのものです。社内で構築された言語を読んでください)

あなたが知っている XPath ツールで、整形式でない HTML を混乱させるのに特に優れているものはありますか?

4

2 に答える 2

4

XPath 式は、整形式でない XML ドキュメントに対して評価することはできません。これはまさに説明されているケースです。

これは 2 つの連鎖した手順で行うことができます。最初の手順は HTML を適切な形式の XML に変換することであり、2 番目の手順は XPath 式を適用することです。

したがって、この問題は、「HTML を XML に変換して XPath 式を評価できるようにする方法」とより正確に述べることができます。

2 つの優れたツールを次に示します。

  1. オープン ソース プログラムであるTagSoupは、 John Cowanによって開発された Java および SAX ベースのツールです。これは Java で書かれた SAX 準拠のパーサーであり、整形式または有効な XML を解析する代わりに、実際に見られる HTML をそのまま解析します。TagSoup は、合理的なアプリケーション設計に似たものを使用して、このような処理を行う必要がある人向けに設計されています。SAX インターフェイスを提供することにより、標準の XML ツールを最悪の HTML に適用することもできます。TagSoup には、HTML ファイルを読み取り、クリーンな HTML または XHTML に近い整形式の XML を生成できるコマンドライン プロセッサも含まれています。Taggle は、TagSoup の商用 C++ ポートです。

  2. SgmlReaderは、Microsoft のChris Lovettによって開発されたツールです。SgmlReader は、任意の SGML ドキュメント (HTML の組み込みサポートを含む) に対する XmlReader API です。整形式の XML 結果を出力するコマンド ライン ユーティリティも提供されます。スタンドアロンの実行可能ファイルと完全なソース コードを含む zip ファイルをダウンロードします: SgmlReader.zip

  3. David Carlisleによって書かれたHTML の純粋な XSLT 2.0 パーサー。そのコードを読むことは、私たち全員にとって素晴らしい学習練習になるでしょう.

説明から:

"d:htmlparse(string) d:htmlparse(string,namespace,html-mode)

引数が 1 つの形式は、d:htmlparse(string,' http://ww.w3.org/1999/xhtml ',true()))と同等です。

組み込みのヒューリスティックを使用して文字列を HTML や XML として解析し、要素の暗黙的な開閉を制御します。

HTML DTD の完全な知識はありませんが、空の要素の完全なリストとエンティティ定義の完全なリストがあります。HTML エンティティ、および 10 進数と 16 進数の文字参照はすべて受け入れられます。html-mode=false() の場合でも、html-entities は認識されることに注意してください。

要素名は小文字化され (html-mode が true() の場合)、namespace パラメーターで指定された名前空間に配置されます (入力に明示的な名前空間宣言が含まれていない限り、これは名前空間がないことを示す "" である可能性があります。その場合、これらは尊重されます)。 .

html-mode=true() の場合、属性名は小文字になります"

詳細な説明はこちらをご覧ください。

于 2008-12-10T02:21:20.793 に答える
0

XPath は HTML では直接動作しません。XPath と HTML の相互作用は、HTML を解析してレンダリング ツリーにするソフトウェア/ライブラリによって決定されます。これにより、検索を適切に行うことができます。

于 2008-12-09T22:40:11.393 に答える