hirschkalb's blog

"I beseech you, in the bowels of Christ, think it possible that you may be mistaken."

Webページからほしい情報だけ抜き出す with Ruby

私はソフトウェア開発プロジェクトに携わる人間であるにもかかわらず、日々「手作業」に追われています。


まさに紺屋の白袴です。このことを反省し、『Rubyスクリプティングテクニック-テスト駆動による日常業務処理術』という本を読み進めています。


特に目的もなく、お勉強の結果を貼り付けておきたいと思います。


Webページから、必要な情報を抽出するスクリプトです。例は、ニコニコ動画マイリストランキングの上位30を表示するものです。


ソースは以下の通りです。


$ cat -n trip.rb
1 require 'uri'
2 require 'open-uri'
3
4 def trip(url, pattern, step)
5 html = open(url).read
6 rank = 1
7
8 step.times do
9 puts "No. #{rank.to_s.ljust(4)} #{pattern.match(html)[1]}"
10 html = $'.to_s
11 rank += 1
12 end
13 end
14
15 if $0 == __FILE__
16 url = 'http://www.nicovideo.jp/ranking/mylist/daily/all'
17 pattern = %r{<h3><a class="video" href=".*">(.*?)</a>}
18 step = 30
19
20 trip(url, pattern, step)
21 end
$

実行した結果は以下の通りです。


$ ruby trip.rb
No. 1 初音ミクがオリジナル曲を歌ってくれたよ「初めての恋が終わる時」
No. 2 たぶん最後のお絵かき講座
No. 3 レゴでコマ撮りしてみた
No. 4 【マクロスF】娘々スペシャルサービスメドレー特盛り【劇場版支援】
No. 5 初音ミクオリジナル曲 「Little Traveler」
No. 6 いかなるバグにも動じずポケモン赤を実況7
No. 7 【動画版】FF6 決戦の最高ぉおおおお!【CLAMMAD】
No. 8 アイドルマスター KOTOKO Princess Bride! 1MbpsVer.
No. 9  縛  ら  な  い   【DQ5実況】 6回目
No. 10 【MAD】CLANNAD もう一つの世界 智代編 楔 〜 くさび 〜
No. 11 もってってってーけ
No. 12 進研ゼミがついに始まったwwwwww
No. 13 【Photoshop】FFっぽいロゴの作り方ですとも!【FF手書き】
No. 14 【初音ミク】モーメント【オリジナル】
No. 15 【落書き漫画】完全、瀟洒、十六夜咲夜【東方】
No. 16 【MUGEN】ゲージMAXシングルトーナメント【Finalゲジマユ】part49
No. 17 TV不適切発言集〜爆笑編〜
No. 18 アメリカ人が零を実況プレイするとどうなるか
No. 19 【PS3Final Fantasy Versus XIII DK3713最新PV 高画質【FF13】
No. 20 【かんなぎ】ふぃぎゅ@ハロー大豆【MAD】
No. 21 アイドルマスター 『神さまのBirthday』 IM@SALLSTARS
No. 22 〔手書き〕絵本『人柱アリス』のPVらしきもの(完成)
No. 23 東方JAM『未来への咆哮
No. 24 サガシリーズ名曲メドレー(改)
No. 25 【凍死確定】チルノのパーフェクトさんすう教室を踊った【満身創痍】
No. 26 【手描き】ワールドイズマイン【PV】
No. 27 【FF6】20代後半の叔母さんが頑張ります【実況プレイ】その23
No. 28 西の女子がヨッシーアイランドをぬるく実況プレイ 1でっていう
No. 29 【訛り実況】 FINAL FANTASY X Vol:47
No. 30 もってけ!3分クッキング
$

p.s. rankを自前で用意する必要はないとのご指摘を受けました。

以下の通り*1、| i |を出力すればよいのでした。


$ ri Integer.times
Integer#times
int.times {|i| block } => int

                                                                                                                                              • -

Iterates block _int_ times, passing in values from zero to _int_ -
1.

5.times do |i|
print i, " "
end

_produces:_

0 1 2 3 4

したがって、例のソースは以下のように書くことができますね。


$ cat -n trip.v1.rb
1 require 'uri'
2 require 'open-uri'
3
4 def trip(url, pattern, step)
5 html = open(url).read
6
7 step.times do | rank |
8 puts "No. #{(rank+1).to_s.ljust(4)} #{pattern.match(html)[1]}"
9 html = $'.to_s
10 end
11 end
12
13 if $0 == __FILE__
14 url = 'http://www.nicovideo.jp/ranking/mylist/daily/all'
15 pattern = %r{<h3><a class="video" href=".*">(.*?)</a>}
16 step = 30
17
18 trip(url, pattern, step)
19 end

ひとつ賢くなりました。

*1:riの出力結果は少し修正を入れています。pre記法はちょっと私にはむずかしいです。

広告を非表示にする