メインコンテンツにスキップ

XPath基礎編 - 2.基本文法、ノード、軸

今週アップデートされました

XPath は XML(および HTML)文書の中から必要なノード(要素 / 属性 / テキスト)を正確に選択するためのクエリ言語です。OctoparseやWeb Scrapingのデータ抽出でも必須スキルです。


1. XML と XPath の関係

XML 文書は ツリー構造 を持ち、要素(element)、属性(attribute)、テキストノードなどで構成されています。

例えば、以下のXMLドキュメントを考えてみましょう:

<books>
<book id="1001">
<title>Harry Potter and the Philosopher's Stone</title>
<author>J.K. Rowling</author>
<year>1997</year>
</book>
</books>

XPathは、このようなツリー構造から目的のノードを探し出すための道しるべ(パス)を提供します。


2. XPath式の構成要素

XPath 式には以下が含まれます:

要素

説明

パス表現

/books/book/title のようにノードまでの経路を表す

述語([])

条件指定 /book[@id='1001']

演算子

=, <, > など

関数

contains(), text(), last() など


3. XPath の主なノードと軸(axis)

XPath では、ツリー構造のどこからどこへ移動するかを「軸」で指定できます。

よく使う軸:

  • child::(省略可)

  • parent::

  • ancestor::

  • descendant::

  • preceding-sibling::

  • following-sibling::

特に Web ページのパターン分析や 次ボタンの抽出 に非常に役立ちます。


4. サンプル XML を使った抽出例

<books>
<book id="1001">
<title>Harry Potter and the Philosopher's Stone</title>
<author>J.K. Rowling</author>
<year>1997</year>
</book>
<book id="1002">
<title>Harry Potter and the Chamber of Secrets</title>
<author>J.K. Rowling</author>
<year>1998</year>
</book>
</books>
  • すべての書籍タイトル

/books/book/title
  • id=1001 のタイトル

/books/book[@id='1001']/title
  • 著者が J.K. Rowling の書籍

/books/book[author='J.K. Rowling']/title
  • 1997 年より前に出版された書籍(※文字列比較に注意)

/books/book[year < '1997']/title

5. preceding-sibling / following-siblingの基礎

兄弟ノード(同じ親を持つノード)に対して使う軸です。

  • preceding-sibling:: → 指定ノードより前の兄弟

  • following-sibling:: → 指定ノードより後ろの兄弟

例 HTML:

<div>
<p>これは1番目の段落です。</p>
<p>これは2番目の段落です。</p>
<p>これは3番目の段落です。</p>
<p>これは4番目の段落です。</p>
<p>これは5番目の段落です。</p>
</div>

  • 3番目の段落の直前(2番目)を取る

 //p[text()="これは3番目の段落です。"]/preceding-sibling::p[1]

preceding-sibling::p …前にあるすべての <p>

[1] …その中の直前の1つ

  • 3番目の段落の 直後(4番目) を取る

 //p[text()="これは3番目の段落です。"]/following-sibling::p[1]

同様に [1] は “もっとも近い兄弟” を意味します。


6. preceding / following との違い

対象

主に使う場面

preceding-sibling

兄弟ノードのみ

ページ内の並び順から要素を選ぶ

preceding

文書中のすべての「前のノード」

高度なナビゲーション

following-sibling

後ろの兄弟ノード

次の項目を取得する

following

文書中のすべての「後ろのノード」

順序関係を利用する

続きを読む

こちらの回答で解決しましたか?