1. 概要
「ruby ウェブスクレイピング」で検索すると最初にかかったのが nokogiri なのでこれをちょっと調べてみようと思います。
「Ruby + Nokogiriでスクレイピング」を参考にさせていただきました。
nokogiri というのが、ウェブスクレイピング機能をもったライブラリらしく・・・。
nokogiti というのはどうも日本語の「鋸」のようです。
ウェブを切り出すから?
2. インストール
ruby は pyrhon よりも FreeBSD との親和性が高いようで、どうも ports にあるようです。
ports でインストールできれば、gem は使わなくてもいいかな・・・と。
ports でインストールしてみます。
cd /usr/ports/textproc/rubygem-nokogiri
make
make install
どうやらうまくインストールできたようです。
単独でバージョンが確認できるんですって・・・。
やってみます。
> nokogiri -v
# Nokogiri (1.8.2)
---
warnings: []
nokogiri: 1.8.2
ruby:
version: 2.4.4
platform: amd64-freebsd11
description: ruby 2.4.4p296 (2018-03-28 revision 63013) [amd64-freebsd11]
engine: ruby
libxml:
binding: extension
source: system
compiled: 2.9.7
loaded: 2.9.7
3. タイトルを取得
「Nokogiriを使ったRubyスクレイピング [初心者向けチュートリアル]」を参考にしてタイトルを取得してみます。
#!/usr/bin/env ruby
require 'open-uri'
require 'nokogiri'
charset = nil
html = open(ARGV[0]) do | f |
charset = f.charset # 文字種別を取得
f.read # htmlを読み込んで変数htmlに渡す
end
doc = Nokogiri::HTML.parse(html, nil, charset) # htmlをパース(解析)してオブジェクトを生成
puts doc.title # タイトルを表示
これが、Google 大先生だとうまくいくのに、本サイトだとうまくいかない・・・。
> ./ソースファイル名.rb https://www.google.co.jp/
Google
> ./ソースファイル名.rb http://freebsd.sing.ne.jp/lang/ruby/04/02.html
ruby - a?|a?§a??a?1a? ̄a?¬a??a??a?3a?° - open-uri
まぁ文字化けですわな。
おかしいと思って
puts charset
を追加して実行すると
> ./ソースファイル名.rb https://www.google.co.jp/
shift_jis
Google
> ./ソースファイル名.rb http://freebsd.sing.ne.jp/lang/ruby/04/02.html
iso-8859-1
ruby - a?|a?§a??a?1a? ̄a?¬a??a??a?3a?° - open-uri
ん~、なんか変ですね。
html 内の
<meta charset="UTF-8">
が解釈できていない?
4. 修正
「Nokogiri で文字化けを防ぐ」を参考にしてソースを修正。
#!/usr/bin/env ruby
require 'open-uri'
require 'nokogiri'
url = ARGV[0]
html = open(url).read
html.sub!(/^<!DOCTYPE html(.*)$/, '<!DOCTYPE html>')
doc = Nokogiri::HTML(html)
puts doc.title # タイトルを表示
> ./ソースファイル名.rb http://freebsd.sing.ne.jp/lang/ruby/04/02.html
ruby - ウェブスクレイピング - open-uri
なんだ、こちらの方が簡単で短くて正確でした。