nokogiriを使ったスクレイピングでは、解析したいHTMLなどのドキュメントをDOMに変換し、そこから取得したい情報を指定するためにcssセレクタが使えます。

そこで今回は基礎編と題しまして、スクレイピングで使用するCSSセレクタをいくつかご紹介します。

はじめに

<!DOCTYPE html>
<html>
  <head><title>タイトル</title></head>
  <body>
    <div>
      <h1>見出し</h1>
      <p>1つめ</p>
      <p>2つめ</p>
      <span>
        <p>3つめ</p>
      </span>
    </div>
  </body>
</html>
上記のHTMLファイルを用意し、そこから情報を取得していきます。

NokogiriでHTMLをパース

require "nokogiri"

#HTMLファイルの読み込み
html = File.open("sample.html"){|f| f.read }

#Nokogiriオブジェクトを生成
doc = Nokogiri::HTML.parse(html)
cssメソッドで各要素にアクセスしていきます。

基礎編

子孫要素

doc.css("div p")

#<p>1つめ</p>
#<p>2つめ</p>
#<p>3つめ</p>
上記のように各タグ名を半角スペースで区切ることでdiv要素の子孫である全てのp要素を取得できます。 子孫となる要素は直下にある必要はなく、この場合2つめのp要素よりもさらに下の階層にある3つめのp要素も取得できます。

直下の子要素

doc.css("div > p")

#<p>1つめ</p>
#<p>2つめ</p>
タグを「>」で区切ることでdiv要素直下のp要素を取得できます。 こちらは直下の要素のみなので3つめのp要素は取得されません。

直近の後要素

doc.css("h1 + p")

#<p>1つめ</p>
「+」でタグ名を区切ることでh1要素直後のp要素を取得できます。 今回はh1要素の直後にある1つめのp要素が取得されます。 また後要素(p)は前要素(h1)と同じ階層にある必要があります。

後要素

doc.css("h1 ~ p")

#<p>1つめ</p>
#<p>2つめ</p>
このように「~」でタグを区切ることで前要素(h1)の後ろにある要素(p)を取得できます。 こちらは前要素と後要素が同じ階層にある必要がありますが、後要素は直後にある必要はありません。

ある文字列を含む要素

doc.css("p:contains('3つめ')")

#<p>3つめ</p>
要素内に特定の文字列を持つ要素を取得したい場合は、:contains(‘文字列’)で文字列を指定すると要素を取得できます。また上記のように要素名(ここではp)を明示することで、p要素のうち内容に’3つめ’をもつ要素を取得できます。

最後に

数あるcssセレクタの中でも基本となるものを主にご紹介しました。
この他のスクレイピングで使うcssセレクタについては別記事でも紹介していきたいと思います。

興味のある方は、是非ご自身でも調べてみてください。