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')
この項、まだまだ続きます。