ruby - RSS 作成 - コンテンツの収集・最上位から

 
1. 概要
2. モジュール

1. 概要

 サイトのホームページから始まって、サイト内のコンテンツを最上位から収集するモジュールです。  リンクチェック時のものを加工しています。

2. モジュール

 まだ手直しがあるかもしれませんが、こんな感じで・・・。
=begin

指定の URI を取得して、ドキュメント内のリンク先を抽出する

=end

require('pry')
require('open-uri')
require('nokogiri')
require('CheckChild')
require('ExceptLog')

class CheckParent < BaseClass
  def initialize(original)
    @check = CheckChild.new(original)
  end

  def execute(uri, tree, checked, contents)
    begin
      #puts("[#{self.class.name}.#{__method__}] uri=[#{uri}]")

      tree.each do | key, value |
        if (key == uri)
          if (value != 'UNKNOWN')
            return;
          end
        end
      end

      originalURI = uri
      tree[originalURI] = 'CHECKING'

      uri = URI.encode(uri)
      uri = URI.parse(uri)

      html = open(uri).read
      html.sub!(/^<!DOCTYPE html(.*)$/, '<!DOCTYPE html>')

      doc  = Nokogiri::HTML(html)               # Nokogiri でドキュメントを抽出
      link = Hash.new

      # ini ファイルで定義してある、タグ、クラス内の <a href="URI"> の URI の部分を取得

      $parameter[:linkclass].each do | linkclass |
        doc.css($parameter[:linktag]).css('.'+linkclass).each do | innerclass |

          innerclass.css('a').each do | tag |
            link[tag[:href]] = nil              # <a href="URI"> の URI の部分を取得
          end
        end
      end

      link.delete(nil)                          # nil が湧いて出ることがあるので削除

      # 下記のモジュールで doc を書き換えてしまうので上記の処理でデータを抽出した後でないと
      # 下記のモジュールをコールしてはいけない
      # Nokogiri で取得したドキュメントは clone できない

      contents.get(originalURI, doc)

      link = Hash[link.sort]

      #binding.pry

      tree[originalURI] = @check.execute(originalURI, doc, link, checked, contents)
      #puts("[#{tree}]")
      #binding.pry

#      if (originalURI == "https://freebsd.sing.ne.jp/01/08.04/")
#        exit 1
#      end
      return tree

    rescue OpenURI::HTTPError => error
      #puts("  例外発生[#{error.class}]")       # 呼び出し側でログを出力するのでここでは出力しない
      #puts("  #{uri} 収集時にエラー")
      return 'unknown'
    rescue SocketError => error
      puts("  例外発生[#{error.class}]")
      puts("  #{uri} 収集時にエラー")
    rescue Errno::ECONNRESET => error
      puts("  例外発生[#{error.class}]")
      puts("  #{uri} 収集時にエラー")
    rescue Errno::ECONNREFUSED => error
      puts("  例外発生[#{error.class}]")
      puts("  #{uri} 収集時にエラー")
    rescue => error
      exeptlog = ExceptLog.new
      exeptlog.execute(self, error)
      exit 1
    end
  end
end

 後で流用するためにツリー構造のオブジェクトを上位に返すようにしました(2018年11月09日)。