2013-10-10 12:30

nokogiriでhtml解析

nokogiriとは

特定のWebページのhtmlを読み込んで解析する為のライブラリです。

Webページから情報を取得したい場合に使用します。

公式サイト
http://nokogiri.org/

gemのインストール

早速インストールしましょう。

ターミナル
$ gem install nokogiri

Webページの取得

使い方は簡単。

ruby
require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open("ページのURL"))

これで指定したページにアクセス、htmlを取得して変数docに格納します。

nokogiriとopen-uriのrequireを忘れないでね。

要素へのアクセス

htmlの要素を検索する方法は下記の2通りあります。

CSSで検索

cssメソッドの引数にCSS記法で要素を指定して検索します。

ruby
doc.css('a').each do |anchor|
  puts anchor.content
end

この例では、aタグを検索、eachしてブロックに渡しています。

ブロックに渡されたaタグのコンテンツをターミナルに吐き出しています。

XPathで検索

xpathメソッドの引数にXPathで要素を指定して検索します。

ruby
doc.xpath('//p').each do |anchor|
  puts anchor.content
end

この例では、pタグを検索、eachしてブロックに渡しています。

ブロックに渡されたaタグのコンテンツをターミナルに吐き出しています。

値の取得

最終的に値を取得する際は下記のようなメソッドを使用します。

ruby
element.content                        # タグのテキストを取得
element.name                            # name属性を取得
element.attribute("href")      # 指定した属性を取得
element.attributes                   # 属性情報のハッシュを取得
element.children                      #子要素の配列を取得

elementはcssメソッドやxpathメソッドで取得した要素の内容です。

他にも色々あるみたい。

サンプル

サンプルをば。

yahoo!JAPANのページからaタグを検索し、そのテキストとhref属性をターミナルに表示します。

sample.rb
# -*- coding:utf-8 -*-

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open('http://www.yahoo.co.jp/'))

doc.css('a').each do |anchor|
  puts anchor.content
  puts anchor.attribute("href")
end
ターミナル
$ ruby sample.rb

とすると、、、

ターミナル
     .
     .
     .
ショッピング
r/c1
ヤフオク!
r/c2
旅行、ホテル予約
r/c5
ニュース
r/c12
天気
r/c13
スポーツ
r/c14
ファイナンス
r/c15
     .
     .
     .

という結果になります★