XPathとは?
Scrapeless Scraping Browserは、レンダリングされた公開ページのDOMコンテンツを提供し、抽出ワークフローがXPath式でナビゲートできます。
要点
- XPathはツリー構造データにおいて値とノードを選択するための式言語です。 そのパス構文は、子、子孫、親、先祖、兄弟、属性をナビゲートできます。
- XPathはコンテキストノードから動作します。 絶対パスはドキュメントのルートから始まり、相対パスは現在のコンテキストから始まります。
- 述語は候補ノードをフィルタリングします。 属性値、位置、テキストテスト、関数がパスを狭めることができます。
- 選択が関係に依存する場合、XPathは有用です。 親または先祖のトラバースとテキスト依存の条件は、これを選択する一般的な理由です。
XMLパス言語の略であるXPathは、ツリー内のノードと値にアクセスするために使用される式言語です。その名前はXMLに由来していますが、ブラウザや自動化APIはHTMLドキュメントに対してもXPathを評価できます。
その W3C XPath 3.1勧告 は、XPathをデータモデルに対して階層的なアドレッシングを提供する式言語として定義しています。
XPathはどのように機能しますか?
XPathは式をコンテキストに対して評価し、一致するノードまたは計算された値を返します。
パスはステップで構成されています。各ステップは軸を選択し、ノードテストを適用し、述語を追加できます。式は //article[@data-id] data-id属性を持つ記事の子孫を選択します。式は .//h2 現在のコンテキストノードのH2子孫を検索します。
XPath式の主な部分は何ですか?
XPathはロケーションステップ、軸、ノードテスト、述語、および関数を組み合わせています。
| 構文 | 目的 | 例 |
|---|---|---|
/ | 絶対パスを開始するか、子ステップを区切ります | /html/body |
// | 現在の地点から子孫を選択します | //main//a |
. | 現在のコンテキストを参照します | .//span |
.. | 親に移動します | //span/.. |
@ | 属性を選択またはテストします | //a/@href |
[ ] | 候補ノードをフィルタリングします | //li[@data-id] |
XPathの軸とは?
XPathの軸は、コンテキストノードと候補ノードとの関係を説明します。
- 子と子孫。 一段下に移動するか、より深い子孫を検索します。
- 親と先祖。 既知のノードから含む要素に上昇します。
- 従兄弟ノードと先行兄弟ノード。 コンテキストノードの隣にあるノードを選択します。
- 属性。 要素ノードではなく属性を選択します。
- 自己。 現在のコンテキストノードをテストまたは保持します。
XPathはウェブスクレイピングでどのように使用されますか?
ウェブスクレイパーは、ドキュメントの構造と関係に基づいて要素、属性、およびテキストを特定するためにXPathを使用します。
テキスト依存の選択
テキストでラベルまたは見出しを見つけ、その近くの値を選択します。
祖先の走査
安定した子ノードから始めて、それを所有するレコードコンテナに移動します。
兄弟姉妹の関係
ページに有用な属性が欠けている場合は、既知のラベルに従う値を選択してください。
XMLソース
名前空間やドキュメント固有の構造を持つフィードやその他のXMLドキュメントをナビゲートします。
ブラウザ Document.evaluate() メソッドは、コンテキストノードに対してXPath式を評価し、XPathResultを返します。
The MDN XPath と CSS の比較 軸がCSSのコンビネータや新しい擬似クラスに対応している場所と、XPathが独自の機能を保持している場所を示しています。
メンテナブルなXPathを書くにはどうすればよいですか?
メンテナブルなXPathは、ドキュメントのルートから絶対パスをコピーするのではなく、安定した属性とローカルな関係を使用します。
- 安定したコンテキストノードを選択してください。例えば、レコードコンテナなどです。
- ルール: 1. 翻訳されたテキストのみを出力し、説明や追加のコードフェンスは一切行わないこと。 2. Markdown/HTML構造(見出し、リスト、リンク、テーブル)をそのまま正確に保持すること。 3. @@CODEBLOCK_0@@や@@INLINECODE_0@@のようなプレースホルダートークンをそのまま保持すること; 決して翻訳、並べ替え、統合、または再フォーマットしないこと。 4. ``` コードフェンスを追加したり削除したりせず、通常のテキストをコードブロックにラップしないこと。
- ルール: 1. 翻訳されたテキストのみを出力し、説明や追加のコードフェンスを含めないこと。 2. Markdown/HTML構造を正確に保持すること(見出し、リスト、リンク、表)。 3. @@CODEBLOCK_0@@ や @@INLINECODE_0@@ のようなプレースホルダートークンは正確にそのまま保持すること;決して翻訳、順序の変更、結合、再フォーマットしないこと。 4. 通常のテキストをコードブロックにラップせず、```コードフェンスを追加したり削除したりしないこと。 広範な子孫検索は、より小さなコンテキストが利用可能な場合は制限する。
- 現在のレイアウトに結びついた長い位置パスを避けてください。
- いくつかのページのバリアントで表現をテストし、結果のカウントを確認します。
XPath式はどのように評価されますか?
XPathは、コンテキストノードに対して式を評価します。ロケーションステップは、軸に沿ったノードを選択し、ノードテストを適用し、その後、結果のシーケンスを述語でフィルタリングします。コンテキストは重要です:@@INLINECODE_0@@で始まる式は、 // 広いルートから子孫を検索し、相対式は始まります . 現在のレコードコンテナに固定されたままです。
この評価モデルは、同じ表現がブラウザコンソールとパーサーループ内で異なる結果を返す理由を説明します。ループがすでに1つのプロダクトカードを保持している場合、相対パスはそのカードから始まるべきです。スコープのない子孫検索は、意図されたレコードから脱出し、ページ上で最初に一致する値を繰り返し返す可能性があります。
ノードの順序と結果タイプも重要です。式は、エンジンや呼び出しAPIに応じて、ノードシーケンス、文字列、数値、またはブール値を生成することができます。抽出コードが誤って間違ったノードを文字列化したり、複数の結果を無視したりしないように、ライブラリ契約を読んでください。
ウェブ抽出に重要なXPath軸はどれですか?
子供および子孫の軸は、ほとんどの下向きナビゲーションをカバーします。属性は、要素に付随する値を選択します。親および祖先は、フィールドがラベル付きセクションまたは囲まれたレコードに関連している必要があるときに上向きに移動します。その後の兄弟および前の兄弟は、親を共有する近くの要素を接続します。
軸は絶対位置ではなく関係を記述するため、便利です。価格は、無関係なカードが類似のクラスを使用している場合でも、商品見出しと同じカードから選択できます。専用の列クラスが存在しない場合でも、テーブルの値はヘッダーセルに関連付けることができます。
広軸は隠れた一致を作成することもあります。あまりにも遠くに登る祖先検索は、ページ本体に到達することがあり、その後の検索は別のレコードに交差する可能性があります。特定のノードテストと述語で軸を制限し、各代表テンプレートでそれが返すノードの数を確認します。
XPathの述語はどのように機能しますか?
述語はステップによって選択されたノードをフィルタリングします。属性、子要素、正規化されたテキスト、位置、または条件の組み合わせをテストできます。述語はコンテキスト内で実行されるため、位置は元のマークアップの普遍的なインデックスではなく、現在のノードシーケンスに対して相対的です。
属性の等価性は、ページが意味のある識別子を公開する際に、通常は位置よりも明確です。ラベルが関係を定義する場合、テキスト条件は便利ですが、目に見える言語は地域や編集の改訂によって変わる可能性があります。適切な場合にはホワイトスペースを正規化し、いくつかの無関係なラベルを受け入れる可能性のある部分的なテキスト一致は避けてください。
小さい述語を保ちつつ説明してください。複数の選択肢ラベル、深い祖先、および数値位置を組み合わせた表現は、ページ分類をフィールド選択から分けてください。既知のテンプレートごとに短いXPathを使用することは、すべての可能なページに耐えることを意図した1つの表現よりもテストするのが通常簡単です。
XPathにおける名前空間とは?
名前空間は、ローカル名を共有するが異なる語彙に属する要素を区別します。これは特にXML、SVG、および混合文書に関連しています。XPath式内の名前空間プレフィックスは、ブラウザまたはパーサーによって使用されるAPIを通じて、正しい名前空間URIに関連付けられなければなりません。
HTML ドキュメントを HTML として解析した場合、XHTML や XML ドキュメントとは異なるネームスペースの動作を持つことがあります。HTML DOM で動作する式は、同じように見えるマークアップが XML パーサーを通して処理されると失敗することがあります。パスを調整する前に、レスポンスのコンテンツタイプと解析モードを確認してください。
埋め込まれたSVGまたは別のネームスペースが対象の一部である場合は、選択したエンジンで直接テストしてください。一部の便利なAPIはネームスペース解決ヘルパーを提供しますが、他のAPIは明示的なマッピングを必要とします。単に表現を一致させるためにネームスペースチェックを削除しないでください。そうすると、同じローカル名を持つ意図しない要素が選択される可能性があります。
XPathをデバッグし、維持するにはどうすればよいですか?
一度に一歩ずつデバッグします。安定したコンテナを準備し、返されたノードを調査し、現在の結果が正しい場合のみ次の軸または述語を追加します。製造コードが使用する同じコンテキストノードからの相対パスをテストします。
リストページ、詳細、空の状態、ローカライズされたバリアント、およびオプションのモジュールのためのストア代表ドキュメント。アサーションは値、ノード数、およびレコードの境界をカバーする必要があります。まだ1つの文字列を返すパスは、今やパンくずや隠れた重複を指している場合、間違っている可能性があります。
バージョン表現と抽出スキーマおよびページ分類器。ソースが新しいテンプレートを導入する際、それを明示的に特定し、その存在を測定します。これにより、XPathのメンテナンスが追跡可能になり、既に理解が難しい動作を持つ表現に別のブランチが静かに追加されることを避けます。
結論
XPathは、ナビゲーション、フィルタリング、および計算された値に強いサポートを持つツリークエリ言語です。親、祖先、兄弟、属性、またはテキスト条件によって、役立つアンカーと目的のノードが関連するデータ抽出タスクに適しています。
あなたのウェブデータワークフローを構築する準備はできましたか?
Scrapelessを使用して公開ウェブコンテンツを取得し、次にデータセットに適した発見と抽出パターンを適用します。
無料スタート →FAQ
XPathはHTMLで機能しますか?
はい。ブラウザおよび自動化APIは、解析されたHTMLドキュメントに対してXPathを評価できます。これは、実装されているXPathのバージョンや機能によります。
XPathにおける/と//の違いは何ですか?
単一のスラッシュは直接的な子ステップを分けますが、二重スラッシュは現在の地点からの子孫を検索します。
XPathは属性を選択できますか?
はい。属性軸は@プレフィックスを使用し、リンク要素のhref属性には//a/@hrefのように指定します。
広範な//検索はなぜスコープを指定すべきですか?
小さなコンテキストは不要なトラバースを減らし、式の意図されたレコード境界をより明確にします。