野球統計サイトで読んだばかりの投稿を分析したいと思います。問題のページはhttp://www.fangraphs.com/blogs/fangraphs-crowd-the-top-47-free-agents/で入手できます。
プレーヤーの名前の下の段落タグにあるプレーヤーの名前で始まるデータ (リストにあるものを示すブロック画像付き) をスクレイピングしたいと思います。(そのため、すぐ下のテーブル データではありません。)
データの例:
#1 Robinson Cano (2B)
Age PA BB% K% AVG OBP SLG wOBA wRC+ Off Def WAR
30 681 9.5% 12.5% .314 .383 .516 .384 142 30.6 2.5 6.0
Real Years: 8
Real AAV: $24.5
Real Total: $196.2
Fake Years: 5
Fake AAV: $23.9
Fake Total: $119.7
Representative Comment
“I wouldn’t want to guarantee salary past age 37 or age 38. I could see him getting more years than that, at the same AAV I am willing to pay in fake world.”
[next player in example]...
#2 Jacoby Ellsbury
[etc.]
番号付きアイテム (#1) は OL にはありませんが、a タグに name 属性があります。だから掴めます。残念ながら、残りのデータは、簡単に取得できるように html で構造化されていないようです。
「実際の年: 8」から「偽の合計: $119.7」までのデータを抽出しようとしています。(注: 他のプレーヤーの中には、「予選オファーを受け入れる」など、異なるデータ キーを持っている人もいます。これらすべてのキーが何であるかはわかっていますが、すべてのプレーヤーがすべてのデータ エントリを持っているわけではありません。)
私の戦略は、リストの最初のプレーヤーを選択し、そこから兄弟要素を取得することでした。兄弟要素のテキストが既知のキー (「Real Years」など) の 1 つと一致する場合は、その数値を保存します。兄弟要素が<a>
name 属性を持つ要素である場合、それが次のプレーヤーであり、ループの次の繰り返しに進むことがわかります。
他の人がこの問題にどのようにアプローチするのか興味があります。私のやり方はぎこちなく感じますが、それが、ページに HTML 構造を追加せずに想像できる唯一のアプローチです。
私はpythonとlxml.htmlモジュールを使用しています。