xpathで曖昧なパスを指定して要素を取得する

2015 年 5 月 11 日 by 山平

xpathはxmlに限らず、Webサイトのスクレイピングでも重宝します。

DOMと組み合わせれば曖昧な条件で目的の要素を検索できるので、昨今のhtmlにありがちな「装飾用の要素」と「制御用の要素」が混在したツリー構造に力を発揮します。

上で「曖昧な条件で目的の要素を検索できる」ための条件として「DOMと組み合わせ」る必要があるような言い方をしていますが、先日、xpathだけでもかなり柔軟に条件を指定できることを知りましたので、ここに覚書しておきます。

rubyのNokogiriで、任意の要素を以下のように取得します。

a=doc.xpath(“//hoge”)

この配下から、さらに任意の要素を取得しようとして、以下のように書くとうまくいきません。

b=a.xpath(“//fuga”)

“//”で始まっているので、ルートから辿り直してしまうようです。
これを防ぐためには、2回に分けて書かずに、以下のように書きます。

c=xpath(“//hoge//fuga”)

こうすることで、任意の「hoge」配下にある任意の「fuga」だけを探してくれます。
こちらの方がスマートですね。

なお、これはxpathの仕様のようですので、DOM(xpath)が実装されている環境ならどこでも使えるようです。

試しにFireBug上で動作を確認してみました。
JavaScriptでxpathを扱う方法については、以下のサイトなどを参考にしてください。

また、xpathで要素を検索するため、以下のサイトを使用しました。

まずは任意のnavタグを検索します。

document.evaluate('//nav', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
//=>[nav.navbar.navbar-inverse.navbar-fixed-top, nav.navbar.navbar-default, nav.navbar.navbar-inverse]

さらにnavタグ配下にあるliタグのさらに配下にあるaタグ、かつクラス属性に「dropdown-toggle」がついているものだけを検索します。

document.evaluate(‘//nav//li//a[@class=”dropdown-toggle”]’, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
//=>[a.dropdown-toggle #, a.dropdown-toggle #, a.dropdown-toggle #]

期待した結果が得られました。

今回は以上です。

TrackBack