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 式には以下が含まれます:
要素 | 説明 |
パス表現 |
|
述語([]) | 条件指定 |
演算子 |
|
関数 |
|
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 | 文書中のすべての「後ろのノード」 | 順序関係を利用する |
続きを読む
