前回書いたnokogiriを使ったRubyでのWebスクレイピングの初級編に続いて記事の更新日付を取得しますが、CSSメソッドを使えば同じ手順で簡単に習得できます。ただ、日付のフォーマットが「2015年09月29日 13時12分」となっているのを、データベースのDATETIME型で管理しやすいように「2015/09/29 13:12」という日付フォーマットに整形してあげるほうが望ましいです。
Rubyの正規表現を使って、日付データ部分のみ取り出せるようになる
まずは、Rubyの正規表現を使って日付の数値部分のみを取り出せるようになります。Rubyの場合は
1 2 3 4 |
/正規表現文字列/ =~ 検索対象文字列 /e/ =~ "testMoji01" #=> 1 |
のように、正規表現文字列をスラッシュで囲むことで正規表現と認識されます。また、それを=~演算子を使い、右辺に検索対象文字列を置くことで、マッチするかどうかを判定します。返り値は、正規表現が対象文字列の中で最初にマッチした位置(一番左を0として数え始める)になります。
また、正規表現には数字や文字の代わりになる文字が用意されており、数字の場合は「\d」を使うと「1文字の数字」とマッチすることを表します。ちなみに、英数字は「\w」、空白は「\s」です。
また、正規表現の後方参照を使うことで、マッチした文字列が格納された変数を使うことができます。マッチした文字列は$&に格納されます。
1 2 3 |
/\d/ =~ "2015" p $& #=> 2 |
日付データが「”2015-10-01″」の場合は以下のようにして日付の数字部分を取り出せます。これを取り出すためには、グループ化を使って取り出したい部分を「()」で囲み、部分ごとにグループを作ります。複数のグループの後方参照は$1,$2,…というようにダラーにつづいて連番の変数に、マッチした文字が格納されます。
これを使って以下のように日付データから日付を表す数字のみを取り出せました。
learn_regexp01.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
str1 = "2015-10-01" /(\d+)-(\d+)-(\d+)/ =~ str1 p $1 + "/" + $2 + "/" + $3 #=> "2015/10/01" str2 = "2015/10/01" %r{(\d+)/(\d+)/(\d+)} =~ str2 p $1 + "-" + $2 + "-" + $3 #=> "2015-10-01" str3 = "2015年10月01日" /(\d+)年(\d+)月(\d+)日/ =~ str3 p $1 + "/" + $2 + "/" + $3 #=> "2015/10/01" str4 = "2015年10月1日" /(\d+)年(\d+)月(\d+)日/ =~ str4 p $1 + "/" + $2 + "/" + $3 #=> "2015/10/1" str5 = "2015年10月1日 10時22分" /(\d+)年(\d+)月(\d+)日\s(\d+)時(\d+)分/ =~ str5 p $1 + "/" + $2 + "/" + $3 + " " + $4 + ":" + $5 #=> "2015/10/1 10:22" str6 = "2015年10月1日 10時22分" /(\d+)年(\d+)月(\d+)日 (\d+)時(\d+)分/ =~ str6 p $1 + "/" + $2 + "/" + $3 + " " + $4 + ":" + $5 #=> "2015/10/1 10:22" |
出力結果
1 2 3 4 5 6 7 8 |
MyMBA:scraping_traning meguroman$ ruby learn_regexp01.rb "2015/10/01" "2015-10-01" "2015/10/01" "2015/10/1" "2015/10/1 10:22" "2015/10/1 10:22" |
正規表現を使うと、スクレイピングしたデータに対して、色んな加工・整形ができそうです。DBにデータを格納する前には必要な大事な技術ですね。