HTMLの簡単な解析 (Nokogiri, ruby)
[History] [Last Modified] (2016/06/03 12:54:47)
ここは
趣味のプログラミングを楽しむための情報共有サービス。記事の一部は有料設定にして公開できます。 詳しくはこちらをクリック📝
Recent posts
Popular pages

概要

様々な局面でHTMLの解析が必要になります。例えば、こちらのページでも紹介したSeleniumで複雑なことをしようとすると、driver.page_sourceで取得したHTMLを解析したくなります。このような用途のために、RubyにはNokogoriというツールがあります。

公式ドキュメント

本ページの内容を越えるものは、こちらの公式ドキュメントを参照してください。

要素セレクタは2種類

XPathまたはjQueryでもお馴染のCSSセレクタを使用できます。本ページではCSSセレクタを用いた例を示します。

解析対象HTMLの読み込み

Nokogiriの入力はUTF-8である必要があります。ちなみに出力もUTF-8です。

文字列HTMLを解析

sample.rb

#!/usr/bin/ruby
require "nokogiri"
require "selenium-webdriver"

driver = Selenium::WebDriver.for :firefox
driver.manage.timeouts.implicit_wait = 10 # seconds

driver.get "http://www.example.com/"
doc = Nokogiri::HTML driver.page_source.encode("UTF-8") # Nokogiriの入力はUTF-8

p doc.title # タイトルを解析して出力
driver.quit

出力例

$ ruby sample.rb
"Example Domain"

ファイルを読み込み

sample.rb

#!/usr/bin/ruby
require "nokogiri"

f = File.open('/Users/YourName/Desktop/example_domain.html')
doc = Nokogiri::HTML(f)

p doc.title # タイトルを解析して出力

出力例

$ ruby sample.rb
"Example Domain"

要素の選択 (CSSセレクタ)

2つのCSSセレクタメソッドがあります。

  • .css('式'): 合致するすべての要素を配列で返します
  • .at_css('式'): 最初に合致した要素だけを返します

コード例:

doc.css('p.sample-class').each do |sample|
  p sample.to_s
end

p doc.at_css('p#sample-id').to_s

セレクト後の要素情報の取得

本文の取得

p element.text
p element.content # .textメソッドと同じ

親要素

p element.parent.to_s

タグ名

p element.name

属性値

p element['href'] # <a href="http://www.iana.org/domains/example">More information...</a>

さらなるセレクト

p doc.at_css('p#sample-id').css('a').to_s
Related pages