Ruby - ウェブスクレイピング - 日本語を扱えるようにする

 クラウディア
1. 概要
2. 対応

1. 概要

 本項は「Ruby で日本語の URI(URL)をパーズするなら Addressable::URI を使おう」を参考にさせていただこうと思っていたところ。  「ruby の URI で日本語を含むURIに対応する。」でよいことが分かりました。

#!/usr/bin/env ruby

require 'open-uri'
require 'nokogiri'

begin

  uri = URI.parse(ARGV[0])

  html = OpenURI::open_uri(uri).read

  html.sub!(/^<!DOCTYPE html(.*)$/, '<!DOCTYPE html>')

  doc  = Nokogiri::HTML(html)

  puts "#{doc.title}"

rescue => error
  puts "例外発生"
  puts "#{error.backtrace}"
  puts "[#{self.class.name}][#{error.message}]"
end
 というソースで日本語の混じった URI を指定すると

> ./ソースファイル名.rb http://ja.wikipedia.org/wiki/日本
例外発生
["/usr/local/lib/ruby/2.4/uri/rfc3986_parser.rb:21:in `split'", "/usr/local/lib/ruby/2.4/uri/rfc3986_parser.rb:73:in `parse'", "/usr/local/lib/ruby/2.4/uri/common.rb:231:in `parse'", "./test03.rb:8:in `<main>'"]
[Object][URI must be ascii only "http://ja.wikipedia.org/wiki/\u65E5\u672C"]
 エラーになっちゃうんです。

2. 対応

 わざわざ、日本語対応用のモジュールは必要ありませんでした。  前項の parse の前に1手順 encode をかますだけでよいのでした。

#!/usr/bin/env ruby

require 'open-uri'
require 'nokogiri'

begin

  uri = URI.encode(ARGV[0])
  uri = URI.parse(uri)

  html = OpenURI::open_uri(uri).read

  html.sub!(/^<!DOCTYPE html(.*)$/, '<!DOCTYPE html>')

  doc  = Nokogiri::HTML(html)

  puts "#{doc.title}"

rescue => error
  puts "例外発生"
  puts "#{error.backtrace}"
  puts "[#{self.class.name}][#{error.message}]"
end
 正常に動作します。

> ./ソースファイル名.rb http://ja.wikipedia.org/wiki/日本
日本 - Wikipedia