Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

RubyでHTMLを解析する方法を徹底解説!Nokogiriの基本から実践まで

RubyでHTMLを解析(パース)したいと思ったことはありませんか?

この作業は、適切なツールを持っていないと少し難しく感じられるかもしれません。

しかし今日は朗報です。

RubyにはNokogiri(ノコギリ)という素晴らしいライブラリがあり、これを使えばHTMLの解析は驚くほど簡単になります。

それでは、実際の例を見ていきましょう。

Nokogiriのインストール方法

まずは以下のコマンドでnokogiri gemをインストールします。

gem install nokogiri

インストール中にエラーが発生した場合は、次のコマンドを試してみてください。

gem install nokogiri -- --use-system-libraries

ページタイトルを抽出する方法

次に、Nokogiriで解析する基本的なHTMLスニペットを含むスクリプトを作成します。

以下のコードを実行すると、ページのタイトルを取得できます

require 'nokogiri'

html        = "<title>test</title><body>actual content here...</body>"
parsed_data = Nokogiri::HTML.parse(html)

puts parsed_data.title
=> "test"

HTML文字列の代わりに、URLから直接データを取得して解析したい場合はどうすればよいのでしょうか?

その場合は、次のようにします

require 'open-uri'

Nokogiri::HTML.parse(open('https://example.com')).title

これによりHTMLがダウンロードされ、タイトルが取得されます。

さて、タイトルの取得は簡単でしたが、もう少し高度な例も見てみたいですよね?

次は、Webサイトからリンクを抽出する方法を見ていきましょう。

アンカーリンクを抽出する方法

ページからすべてのリンクを取得するには、まず対象となるHTMLが必要です。

先ほどと同じopen-uriを使えば、公開されている任意のWebサイトのHTMLをダウンロードできます。

そして、Nokogiriで解析してドキュメントオブジェクトを取得します。

以下のように記述します

document = Nokogiri::HTML.parse(open('https://example.com'))

document.class
# Nokogiri::HTML::Document

このオブジェクトから情報を問い合わせる方法は、主に2つあります。

  • XPathクエリを使う方法
  • CSSセレクタを使う方法

まずはXPathを使う方法から見てみましょう。

コードはこちらです

tags = document.xpath("//a")

これは何をしているのでしょうか?

このコードはページ内のすべてのHTMLタグをフィルタリングし、指定したタグだけを返します。

この場合は「a」タグです。HTMLにおいて、リンクは「a」タグに含まれていますね。

さて、ここで得られるのは、これらのタグを表すNokogiri::XML::Elementオブジェクトの配列です。

リンクのURLとテキストを取得したい場合は、次のように書きます。

tags.each do |tag|
  puts "#{tag[:href]}\t#{tag.text}"
end

これを実行すると、すべてのリンクが1行ずつ画面に出力されます。

リンク以外の情報、たとえばページ上の画像一覧などをスクレイピングしたい場合も、同じ手順で行えます。

変更が必要なのは、取得したいタグの種類だけです。

たとえば、画像の場合はこうなります。

tags        = document.xpath("//img")
images_urls = tags.map { |t| t[:src] }

imgは画像を表すHTMLタグで、srcは画像のURLが格納されている属性です。

正しいCSSセレクタや属性名がわからないときは、ブラウザの開発者ツールを使って確認しましょう。

NokogiriでCSSセレクタを使う方法

CSSセレクタを使いたい場合は、xpathメソッドをcssメソッドに置き換えるだけでOKです。

具体例はこちら

headers    = document.css("h1")
paragraphs = document.css("p")

注意点at_csscssの違いは、前者が最初に一致した要素のみを返すのに対し、後者は一致したすべての要素を返すという点です。

CSSセレクタを使ってもXPathと同じ結果が得られます。重要なのは、「どのHTML要素を扱いたいか」をNokogiriに伝えることです。

多くの開発者はXPathよりもCSSの方が馴染み深いため、迷ったらCSSを選ぶのがおすすめです。

まとめ

RubyでのHTML解析には、Nokogiriという強力なライブラリが最適です。gemをインストールし、XPathまたはCSSセレクタを使うことで、タイトルやリンク、画像など、ページ内のあらゆる要素を簡単に抽出できます。

Nokogiriの公式ドキュメントはこちらから参照できます。

https://www.rubydoc.info/github/sparklemotion/nokogiri

あわせて読みたい関連記事:Rubyの文字列フォーマット(format)入門

  1. Rubyのマトリックス(行列)とは?配列・Matrixクラス・Daruを使いこなす完全ガイド

    マトリックス(行列)とは、表計算ソフトのようなデータを格納・操作するための2次元(2D)配列のことです。 マトリックスが活躍する場面: チェスやオセロなど、テーブルゲームの盤面を表現する 統計処理やデータ分析を行う グラフやプロットを生成する マトリックスは非常に強力なデータ構造なので、その使い方をマスターしておくと開発の幅が大きく広がります。この記事では、Rubyでマトリックスを扱う3つの方法——配列、Matrixクラス、そしてDaru gem——を順番に解説していきます。 Rubyでマトリックスを作成する方法 最もシンプルな方法は、配列の入れ子(ネスト)を使ってマトリックスを作ることで

  2. RubyのStructとOpenStructの使い方を徹底解説!値オブジェクトを簡単に作る方法

    Rubyには、関連する属性をまとめて保持する「値オブジェクト」を手軽に作れるStructという組み込みクラスが用意されています。本記事では、Structの基本的な使い方から注意点、そしてOpenStructとの違いまで詳しく解説します。 そもそもStructとは何か? StructはRubyに組み込まれたクラスで、新しいクラスを動的に生成し、値オブジェクト(Value Object)を作成するために使われます。値オブジェクトとは、関連性のある複数の属性をひとまとめにして扱うためのオブジェクトです。 具体例を挙げてみましょう。 2つの座標(xとy)を持つPointというデータを表したい場合、この