こんにちは!
今回は、RSSのニュースをNokogiriで解析して、Rubyで扱うまでをまとめてみようと思います。
このまとめでは、Nokogiriというgemを使用して、RSSニュースをRubyで扱えるようにしていきます。
RSSニュースをRubyで扱う事が出来れば、自作キュレーションメディアを作れたりして面白いのでやってみましょう。
今回作るもの
以下のゲーム情報を配信しているRSSから、自動でニュースのタイトル部分を取ってきて配列に入れてみようと思います。
https://automaton-media.com/feed/
とりあえず今回は、簡単なもの作ってまとめる事にします。
(気が向いたら、キュレーションメディアをRailsで作る!みたいな大掛かりな記事を書こうかな)
XMLデータの簡単な説明
RSSニュースのデータを扱う前にXMLについて簡単に説明します。
XML宣言
一番先頭の<?xml version="1.0" 〜
と書かれている部分は、このファイルがXMLファイルである事を表し、必ず先頭に記述する事になっています
channelの定義
XML宣言の次の<channel>
から始まるブロックは、このRSSのチャンネル名を定義したものです。
imageの定義
channelのロゴなどが設定されてます。
Nokogiriをインストール
まずはNokogiriをインストールしてみましょう。
gem install nokogiri
Railsで使う場合は、Gemfileにnokogiriを追加して下さい。
gem 'nokogiri'
Gemfileに追加したらbundle installしましょう。
bundle install
プログラム作成
Nokogiriがインストール出来たところで、実際にプログラムを作って行きましょう。
使用ライブラリをrequireする
まず、nokogiri.rbというファイルを作って、先頭に以下の2行を追加して下さい。
require 'open-uri' # 引数にURLを渡すとURLのデータを取得出来るopenメソッドを使いたいので読み込みます。
require 'nokogiri' # openメソッドで取って来たデータを、nokogiriで取り扱うため読み込みます。
openメソッドでニュース記事を読み込もう
require 'open-uri'
require 'nokogiri'
url = 'https://automaton-media.com/feed/' # 今回読み込むニュースを設定します。
charset = nil # 読み込んだニュースが文字化けしないよう一度nilにして再設定します。
titles = open(url) do |file| # openメソッドでデータを取得し、ブロックに渡して操作します。
charset = file.charset # charsetに読み込んだファイルのcharsetを設定します。
end
openメソッドで取って来たニュースをNokogiriで検索しよう
require 'open-uri'
require 'nokogiri'
url = 'https://automaton-media.com/feed/'
charset = nil
titles = open(url) do |file|
charset = file.charset
doc = Nokogiri::XML(file) # openメソッドで取って来たファイルをNokogiriのオブジェクトにします。
channel = doc.at_xpath('//channel') # ファイル内のchannel部分を取得します。
title = channel.xpath('//title') # channel内にあるtitleを全て取得します。
title.map { |title| title.text } # titleのNodeSetからテキスト部分だけ配列に集めます。
end
puts titles # タイトルを出力してみましょう。
Nokogiriのメソッド説明
- at_xpath 指定したxpathに一致する最初のひとつの要素を返します。(要素をNodeと呼びます)
- xpath 指定したxpathに一致する全ての要素を返します。(要素をNodeSetと呼びます)
実行してみよう
作ったファイルを実行してみます。
ruby nokogiri.rb
以下のように配列にまとめたニュースタイトルが出力出来たでしょうか?

よく使うNokogiriの検索メソッド
Nokogiriの検索メソッドは、抜き出したいニュースの要件に合わせてその都度メソッドをググれば良いのですが、よく使うメソッドを以下にまとめときます。
at
doc.at('//title') # 最初に検索ヒットしたNodeを返します。
at_xpath
doc.at_xpath('//title') # xpathで検索して最初にヒットしたNodeを返します。
xpath
doc.xpath('//title') # xpathでの検索にヒットするNodeSetを返します。
at_css
doc.at_css('title') # cssで検索して最初にヒットしたNodeを返します。
css
doc.css('title') # cssでの検索にヒットするNodeSetを返します。
感想
今回、RSSニュースのタイトルをRubyで配列に集めましたが、ここまで出来れば後はDBに入れてみたり、SlackやLINEに通知してみたり色々出来ると思います。
自分用でまとめサイトを作ってみるというのも面白いかもしれませんね。