2

野球統計サイトで読んだばかりの投稿を分析したいと思います。問題のページは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モジュールを使用しています。

4

1 に答える 1

2

これは 1 回限りの作業のように思えますが、html は解析用に適切にフォーマットされていないため、この Web ページに最適なパーサーを作成するためにあまり労力を費やすべきではありません。クイックアンドダーティが進むべき道です。

はるかに簡単な解決策は、単にページ テキストをコピーし、選択したテキスト エディターに貼り付けて、プレーン テキスト ファイルとして保存することです。その後、テキスト ファイルを解析するスクリプトを記述できます。

「#」で始まる行を探します。これは、新しいプレーヤーのセクションの開始を示します。次に、次のプレーヤーのセクションが始まるまで、それらの行を消費します。

于 2013-10-23T04:00:46.217 に答える