ruby on rails のnokogiriを使い方を教えてください。

http://sports.yahoo.co.jp/の右側にある
MLBの試合結果
「ジャイアンツ 1-6 アスレチックス」だけを
抽出してDBに保存したい
抽出したデータを自分のサイトに表示したいのですが
具体的にどうしたらいいのかわかりません。
教えてください。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/07/18 14:06:21
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント300pt

http://sports.yahoo.co.jp/ の右側の「スコアボード」の部分は、静的な HTML ではなく javascript で生成されています。

ページをロードしたときに、スコアボードの部分のデータが、以下のリクエストで動的に取得されています。
http://sports.yahoo.co.jp/scoreboard/?callback=spnaviJsonp
そのレスポンスは JSONP 形式です。

初期表示では、左端のタブが選ばれた状態で、ひとつめの内容だけが HTML として展開され、二番目の MLB タブは、それが最初にクリックされたときに javascript で HTML が動的に生成され、それ以降のタブの切り替えでは、展開された内容の表示を on / off しています。

MLBの試合結果
「ジャイアンツ 1-6 アスレチックス」だけを
抽出してDBに保存したい
抽出したデータを自分のサイトに表示したいのですが
  ...

javascript で動的に生成される HTML なので、Nokogiri では切り出すことができません。
攻め方としては、ふたつあります。

(1) Ruby で HTTP なリクエストを投げ、返って来た JSONP 形式のデータをパースする

形式が JSONP なので、前後についている callback の書式を取り除いて、JSON モジュールでパースします。
http://docs.ruby-lang.org/ja/2.1.0/class/JSON.html#M_PARSE

(2) 表示するページで、javascript を使って表示する

普通に JSONP に従って、callback で処理をします。
現時点のデータをサイトに表示するのが主目的であれば、こちらの方がお手軽です。
サイトが表示されなくても、バックグラウンドでデータを溜めておきたいのだ、ということであれば、(1) の方法しかありません。


JSON[*].event が "mlb" なデータを探し(二番目固定でも、とりあえず拾える)、
JSON[*].document.Date.Scores が対戦成績の配列です。

(2) のパターン(しかも、やっつけ)ですが、jsFiddle で試してみました。
http://jsfiddle.net/a_kuma3/y7U7g/

(1) のパターンでやるにしても、JSON データの構造についての理解の助けになると思います。



あくまでも、技術的には、こうできる、という話で、Yahoo のスコアボードのデータを二次利用して良いのか、という部分については、別途確認した方が良いと思います。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません