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 #]
期待した結果が得られました。
今回は以上です。