(ヽ´ω`) < 3. 選択された要素から値を取り出す
(ヽ´ω`) < 選択された要素から値を取り出す
2.で選択した要素*_nodes
から、要素が保持している文字列や属性の値を取得する。
(ヽ´ω`) < まずはNodeSetからNodeに
2.でも説明したように、#xpath
や#css
メソッドが返す値は、常にNodeSetオブジェクトとなる。
そこから単一のNodeオブジェクトを取得するために、NodeSet#first
やNodeSet#[]
をメソッドで目的の要素に絞り込む。
(ヽ´ω`) < Nodeオブジェクトから取得できる値って?
ここから選択したNodeオブジェクトから値を取り出すことになるのだが、その前にNodeオブジェクトが保持し得る(Nodeオブジェクトから取得可能な)値を明確にしておく。
Nodeが保持する値として考えられるのは、大きくは以下の3つ。
- 単純な文字列(Stringオブジェクト)
- 属性とその値(Stringオブジェクト)
- その要素が保持する子要素(Node, NodeSetオブジェクト)
それぞれ以下のような構造をとる
厳密には属性を表すAttributeオブジェクト等も取得可能だが、今回はそこまでは深入りしない。なので、取得できる値としてはStringオブジェクトとNodeオブジェクト、Node, NodeSetオブジェクトが取得できる。
(ヽ´ω`) < Nodeが保持する文字列はNode#text
とNode#attr
で取得
上の例で挙げた、Nodeオブジェクトから単純に保持する値を取り出すにはNode#text
とNode#attr
を使う。
(ヽ´ω`) < ここまでの知識で簡単なスクレイピングスクリプトを書いてみる
ここまでの3手順で、実際にYahoo!のトップページからリンクとリンク文字列の一覧を取得するスクリプトを作成してみる。
(ヽ´ω`) < 驚くほど簡単。
(ヽ´ω`) < 子要素の取得はdoc
に対する処理と同じように
選択した要素から、さらに絞って子要素を取得する方法は、先の記事2でdoc
に対してやった選択作業をnode
に対して、同じようにやるだけ。
(ヽ´ω`) < ざっくりとまとめると
深入りしなければ、3つのステップでスクレイピングが可能。
Nokogiri::XML
かNokogiri::HTML
でDOMを作成xpath
かcss
で要素を選択text
かattr
で要素の値を取得
各ステップで、文字コードだったりNodeSetが取得されたりとか注意点はあるものの、基本は上記のメソッドを組み合わせるだけでサクッとお手軽スクレイピングが可能。