jruby での nokogiri 。チュートリアルの勝手なまとめ その1

これからしらばらく、
nokogiri のチュートリアルの 勝手なまとめをアップしたいと思います。


jruby のためのメモであって、cruby1.8.7 では参考にはなるとは思いますが、異なる部分があると思います。私は cruby での検証はしてません。jruby はcruby1.8.7 とほぼ同じですが、まったく同じではありません。マルチバイト文字の扱い部分など。


nokogiri は言うまでもなく ruby用の xml や html 処理のためのライブラリです。
チュートリアルhttp://nokogiri.org/ から辿れます。(当然、英語)

それを見つつ、勝手に自分でまとめ直しつつ書いたメモです。
そのまま忠実に訳したものじゃありませんので、オリジナルのチュートリアルの内容は、かならず http://nokogiri.org/ で確認してください。
(そもそも、自分だけのためのメモでアップしようとは思ってなかったので)

動作の検証は
jruby 1.5.6 (ruby 1.8.7 patchlevel 249) (2010-12-03 9cf97c3) (Java HotSpot(TM) Client VM 1.6.0_22) [i386-java]
ubuntu 10.04
(したがってデフォの文字コードutf-8 にはじめからなっている状態)です。


nokogiri のインストールは、
jruby -S gem install nokogiri
または
sudo jruby -S gem install nokogiri
となりましょうか。( linux の場合ですけど)

nokogiri のバージョンは 1.4.4.2 というのが入ってました。次のバージョンからはかなり速くなると聞きました。(java版がデフォになるかららしいが、よく分かってませんw)


では、チュートリアル勝手まとめの前に、小手調べに nokogiri によるちょっとした html処理、基本サンプル を。


$KCODE = 'UTF8'

require 'rubygems'
require 'nokogiri'

html_doc = Nokogiri::HTML("<h1>こんにちは</h1>", nil, 'utf-8')

puts html_doc.class
puts "h1タグを検索する"
puts html_doc.search("h1")

#=> Nokogiri::HTML::Document
#=> h1タグを検索する
#=> <h1>こんにちは</h1>


# ## 後から encoding を指定する例


$KCODE = 'UTF8'

require 'rubygems'
require 'nokogiri'

html_doc = Nokogiri::HTML("<h1>こんにちは</h1>")
html_doc.encoding=("utf-8") # 後から encoding を指定する

puts html_doc.class
puts "h1タグを検索する"
puts html_doc.search("h1")

#=> Nokogiri::HTML::Document
#=> h1タグを検索する
#=> <h1>こんにちは</h1>


# ## 実行結果サンプル
# ## (実際に html を処理させた場合、デフォルトの header がどうなっているか確認してみる)

$KCODE = 'UTF8'

require 'rubygems'
require 'nokogiri'

html_doc = Nokogiri::HTML("<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>")

puts html_doc

=begin

実行結果

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>

=end


それでは、早速 nokogiri チュートリアル その1 を。


htmlやxml の処理をするには、まず、それらのドキュメントのオブジェクトを生成します。
(日本語の扱い方は、下の方の ※重要 日本語の扱い方 を参照)


# ○sample 1 (HTMLオブジェクトの生成)
html_doc = Nokogiri::HTML("<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>")

# ○sample 2 (XMLオブジェクトの生成)
xml_doc = Nokogiri::XML("<root><aliens><alien><name>Alf</name></alien></aliens></root>")

# ○sample 3 (xmlファイルから XMLオブジェクトの生成)
f = File.open("blossom.xml")
doc = Nokogiri::XML(f)
f.close

# ○sample 4 (インターネットから HTMLオブジェクトの生成)
require 'open-uri'
doc = Nokogiri::HTML(open("http://www.threescompany.com/"))


解析オプション

Nokogiriはドキュメントが解析において、いくつかのオプションを提供します。

* NOBLANKS - 空白ノードを削除
* NOENT - 代替エンティティ
* NOERROR - エラーレポートの抑制
* STRICT - 厳密な解析;不正な文書を解析するときにエラーを発生させる


# ○sample 5 (解析オプションの使用例)
doc = Nokogiri::XML(File.open("blossom.xml")) do |config|
config.strict.noent
end

# または

doc = Nokogiri::XML(File.open("blossom.xml")) do |config|
config.options = Nokogiri::XML::ParseOptions.STRICT | Nokogiri::XML::ParseOptions.NOENT
end


※重要 日本語の扱い方

文字列は内部的には常に utf-8 として処理されます。
しかし日本語を扱う場合には、明示的にエンコーディングを指定する必要があるかもしれません。


# ○sample 6 (utf-8 であることを明示しての XMLオブジェクトの生成)
html_doc = Nokogiri::HTML("<h1>こんにちは</h1>", nil, 'utf-8')

xml_doc = Nokogiri::XML('<foo><bar /></foo>', nil, 'utf-8')

この項、まだまだ続きます。