Ruby curb、scan、gsubを使ってWebページから特定の情報を抽出

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>

 

(1)scanを使ってリンクタグを抽出


 
下記のようにcurbで取得したWebページの情報を含む文字列からリンクタグを抽出します。ページ内にリンクタグは複数あり、scanの結果は配列でリターンされます。
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>
 

(2)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>
 

(3)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番目の部分文字列
 
●サンプルコード

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

関連記事の目次

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です