LoginSignup
3
4

More than 3 years have passed since last update.

【Nokogiri】RSSニュースをRubyで扱ってみよう!

Posted at

こんにちは!
今回は、RSSのニュースをNokogiriで解析して、Rubyで扱うまでをまとめてみようと思います。

このまとめでは、Nokogiriというgemを使用して、RSSニュースをRubyで扱えるようにしていきます。
RSSニュースをRubyで扱う事が出来れば、自作キュレーションメディアを作れたりして面白いのでやってみましょう。

今回作るもの

以下のゲーム情報を配信しているRSSから、自動でニュースのタイトル部分を取ってきて配列に入れてみようと思います。
https://automaton-media.com/feed/

とりあえず今回は、簡単なもの作ってまとめる事にします。
(気が向いたら、キュレーションメディアをRailsで作る!みたいな大掛かりな記事を書こうかな)

XMLデータの簡単な説明

RSSニュースのデータを扱う前にXMLについて簡単に説明します。

ゲームRSSオリジナル説明用.png

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行を追加して下さい。

nokogiri.rb
require 'open-uri' # 引数にURLを渡すとURLのデータを取得出来るopenメソッドを使いたいので読み込みます。
require 'nokogiri' # openメソッドで取って来たデータを、nokogiriで取り扱うため読み込みます。

openメソッドでニュース記事を読み込もう

nokogiri.rb
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で検索しよう

nokogiri.rb
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

以下のように配列にまとめたニュースタイトルが出力出来たでしょうか?

スクリーンショット 2020-05-24 4.39.09.png

よく使う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に通知してみたり色々出来ると思います。
自分用でまとめサイトを作ってみるというのも面白いかもしれませんね。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4