(ヽ´ω`) < 助けてほしいマン

わからないことを助けてほしいマンが書くブログ

(ヽ´ω`) < 3. 選択された要素から値を取り出す

(ヽ´ω`) < 選択された要素から値を取り出す

2.で選択した要素*_nodesから、要素が保持している文字列や属性の値を取得する。

(ヽ´ω`) < まずはNodeSetからNodeに

2.でも説明したように、#xpath#cssメソッドが返す値は、常にNodeSetオブジェクトとなる。

そこから単一のNodeオブジェクトを取得するために、NodeSet#firstNodeSet#[]をメソッドで目的の要素に絞り込む。

(ヽ´ω`) < Nodeオブジェクトから取得できる値って?

ここから選択したNodeオブジェクトから値を取り出すことになるのだが、その前にNodeオブジェクトが保持し得る(Nodeオブジェクトから取得可能な)値を明確にしておく。

Nodeが保持する値として考えられるのは、大きくは以下の3つ。

  1. 単純な文字列(Stringオブジェクト)
  2. 属性とその値(Stringオブジェクト)
  3. その要素が保持する子要素(Node, NodeSetオブジェクト)

それぞれ以下のような構造をとる

厳密には属性を表すAttributeオブジェクト等も取得可能だが、今回はそこまでは深入りしない。なので、取得できる値としてはStringオブジェクトとNodeオブジェクト、Node, NodeSetオブジェクトが取得できる。

(ヽ´ω`) < Nodeが保持する文字列はNode#textNode#attrで取得

上の例で挙げた、Nodeオブジェクトから単純に保持する値を取り出すにはNode#textNode#attrを使う。

(ヽ´ω`) < ここまでの知識で簡単なスクレイピングスクリプトを書いてみる

ここまでの3手順で、実際にYahoo!のトップページからリンクとリンク文字列の一覧を取得するスクリプトを作成してみる。

(ヽ´ω`) < 驚くほど簡単。

(ヽ´ω`) < 子要素の取得はdocに対する処理と同じように

選択した要素から、さらに絞って子要素を取得する方法は、先の記事2でdocに対してやった選択作業をnodeに対して、同じようにやるだけ。

(ヽ´ω`) < ざっくりとまとめると

深入りしなければ、3つのステップでスクレイピングが可能。

  1. Nokogiri::XMLNokogiri::HTMLでDOMを作成
  2. xpathcssで要素を選択
  3. textattrで要素の値を取得

各ステップで、文字コードだったりNodeSetが取得されたりとか注意点はあるものの、基本は上記のメソッドを組み合わせるだけでサクッとお手軽スクレイピングが可能。