Rubyで簡単Web解析|NokogiriでHTML XMLパーサー

| コメント(0) | トラックバック(0)

htmlやxmlを解析するパーサーがすごく簡単だったのでメモ公開。 こでれ、正規表現であれこれする必要がなくなります。

Nokogiriとは

  • HTML XMLのパーサー、解析するモジュール
  • Xpath CSS3 のセレクターを使って要素解析ができる
  • 動作が早いらしい。 Hpricot モジュールと比べると
  • Hpricotの記述と互換

インストール

  • 環境
    • CentOS 6.2
    • ruby 1.9.2 with rbenv

インストール

cmd
$ yum -y install  libxml2-devel libxslt-devel


$ gem install nokogiri -- --with-xml2-lib=/usr/local/lib  \
                         --with-xml2-include=/usr/local/include/libxml2  \
                         --with-xslt-lib=/usr/local/lib  \
                         --with-xslt-include=/usr/local/include \

その他 Mac OS X ,BSD,Windowsは下記

使い方

html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div id="header"><h1>title</h1></div>
<div id="content"><h2>content tiltel</h2></div>
<div id="footer">cont end</div>
</body>
</html>
ruby
# -*- coding: utf-8 -*- 
require 'nokogiri'
# HTMLページのロード ############################
#

# 文字列の場合
html ="<html>...</html>"
doc = Nokogiri::HTML(html)

# fileの場合
File.open("test.html") do |f|
  doc = Nokogiri::HTML(f)
end

# webページの場合 open-uri利用
require 'open-uri'
doc = Nokogiri::HTML(open('http://mukaer.com'))

# xml
doc = Nokogiri::XML(open('http://mukaer.com/atom.xml'))


# 要素の検索 ####################################
#
# Xpath or CSS3 の記述指定が可能

# xpath
doc.xpath("//div")

# css
doc.css("div")
doc.css("#header")
doc.css("div > h1")

# 両方
doc.search("//div" ,"div#footer")


# 1つの要素を取得 ################################
#

doc.css("#header").first
doc.at_css("#header")

# last
doc.css("#header").last


# 要素の情報取得 ################################
#

# to_html
doc.css("div").each do |elm|
  p elm.to_html
end
   #=> "<div id=\"header\"><h1>title</h1></div>"
   #=> "<div id=\"content\"><h2>content tiltel</h2></div>"
   #=> "<div id=\"footer\">cont end</div>"

# inner_html
doc.css("div").each do |elm|
  p elm.inner_html
end
   #=> "<h1>title</h1>"
   #=> "<h2>content tiltel</h2>"
   #=> "cont end"

# content inner_text
doc.css("div").each do |elm|
  p elm.content
end
   #=> "title"
   #=> "content tiltel"
   #=> "cont end"


# attributes
doc.css("div").each do |elm|
  p elm['id']
end
   #=> "header"
   #=> "content"
   #=> "footer"


# map
doc.css("div").map { |e| puts e["id"]}

   #=> "header"
   #=> "content"
   #=> "footer"

その他はNokogiri::XML::Node を参照

参考ページ

公式サイトNokogiri

関連記事

トラックバック(0)

トラックバックURL: http://mukaer.com/cgi-bin/mt/mt-tb.cgi/82

コメントする

PR

PR





検索

Loading

メニュー

twitter