4.3 ruby - ウェブスクレイピング - nokogiri タイトルを取得

 
4.3.1 概要
4.3.2 インストール
4.3.3 タイトルを取得
4.3.4 修正

4.3.1 概要

 「ruby ウェブスクレイピング」で検索すると最初にかかったのが nokogiri なのでこれをちょっと調べてみようと思います。  「Ruby + Nokogiriでスクレイピング」を参考にさせていただきました。  nokogiri というのが、ウェブスクレイピング機能をもったライブラリらしく・・・。  nokogiti というのはどうも日本語の「鋸」のようです。  ウェブを切り出すから?

4.3.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

4.3.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.3.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
 なんだ、こちらの方が簡単で短くて正確でした。