Ruby curb、scan、gsubを使ってWebページから特定の情報を抽出する方法をまとめました。
ここでは、下記Webページからリンク情報を抽出する例を基にしています。
●取得対象のWebページ
<html> <body> <h1>It works!</h1> <a href="#href1" class="#class1">Link1</a> <a href="#href2" class="#class2">Link2</a> <a href="#href3" class="#class3">Link3</a> </body> </html>
※目次をクリックすると目次の下部にコンテンツが表示されます。
scanを使ってリンクタグを抽出
下記のようにcurbで取得したWebページの情報を含む文字列からリンクタグを抽出します。ページ内にリンクタグは複数あり、scanの結果は配列でリターンされます。
string.scan(/<a.*?<\/a>/m)
○サンプルコード
string.scan(/<a.*?<\/a>/m)
○サンプルコード
require 'curb' c = Curl::Easy.new c.url = "http://localhost/index.html" c.http_get web_page = c.body_str result = web_page.scan(/<a.*?<\/a>/m) result.each{|x| puts x }
○実行結果
<a href=”#href1″ class=”#class1″>Link1</a>
<a href=”#href2″ class=”#class2″>Link2</a>
<a href=”#href3″ class=”#class3″>Link3</a>
gsubを使って不要な文字列を除去
上記(1)の例を流用します。リンクタグ内のclass属性をgsubを使って除去する例を示します。
○サンプルコード
○サンプルコード
require 'curb' c = Curl::Easy.new c.url = "http://localhost/index.html" c.http_get web_page = c.body_str result = web_page.scan(/<a.*?<\/a>/m) result.each{|x| x = x.gsub(/class=".*"/,"") puts x }
○実行結果
<a href=”#href1″ >Link1</a>
<a href=”#href2″ >Link2</a>
<a href=”#href3″ >Link3</a>
gsubを使って部分文字列を取得
上記(1)の例でリンクタグ内のhref、class、リンクのタイトルなどの部分文字列を取得する場合の例です。
web_page.scan(/<a href=”(.*?)” class=”(.*?)”>(.*?)<\/a>/m)
この場合は、リンクタグが3つあり、そのリンクタグ内に3つの部分文字列を括弧を使って指定しているので、下記のように二次配列でscanの結果がリターンされます。
result[0][0] 1番目のリンクタグ内の1番目の部分文字列
result[0][1] 1番目のリンクタグ内の2番目の部分文字列
result[0][2] 1番目のリンクタグ内の3番目の部分文字列
result[1][0] 2番目のリンクタグ内の1番目の部分文字列
result[1][1] 2番目のリンクタグ内の2番目の部分文字列
result[1][2] 2番目のリンクタグ内の3番目の部分文字列
result[2][0] 3番目のリンクタグ内の1番目の部分文字列
result[2][1] 3番目のリンクタグ内の2番目の部分文字列
result[2][2] 3番目のリンクタグ内の3番目の部分文字列
○サンプルコード
web_page.scan(/<a href=”(.*?)” class=”(.*?)”>(.*?)<\/a>/m)
この場合は、リンクタグが3つあり、そのリンクタグ内に3つの部分文字列を括弧を使って指定しているので、下記のように二次配列でscanの結果がリターンされます。
result[0][0] 1番目のリンクタグ内の1番目の部分文字列
result[0][1] 1番目のリンクタグ内の2番目の部分文字列
result[0][2] 1番目のリンクタグ内の3番目の部分文字列
result[1][0] 2番目のリンクタグ内の1番目の部分文字列
result[1][1] 2番目のリンクタグ内の2番目の部分文字列
result[1][2] 2番目のリンクタグ内の3番目の部分文字列
result[2][0] 3番目のリンクタグ内の1番目の部分文字列
result[2][1] 3番目のリンクタグ内の2番目の部分文字列
result[2][2] 3番目のリンクタグ内の3番目の部分文字列
○サンプルコード
require 'curb' c = Curl::Easy.new c.url = "http://localhost/index.html" c.http_get web_page = c.body_str result = web_page.scan(/<a href="(.*?)" class="(.*?)">(.*?)<\/a>/m) result.each{|ary| print "href:",ary[0],"\n" print "class:",ary[1],"\n" print "リンクタイトル:",ary[2],"\n" }
○実行結果
href:#href1
class:#class1
リンクタイトル:Link1
href:#href2
class:#class2
リンクタイトル:Link2
href:#href3
class:#class3
リンクタイトル:Link3