2013-10-23 29 views
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,但它確實有在名稱屬性一個標籤。所以我可以抓住它。不幸的是,其餘的數據似乎並沒有在html中構建,很容易獲得時尚。

我期待通過「假總數:$ 119.7」來提取「真實年:8」的數據。 (注意:其他一些玩家有不同的數據密鑰,例如「Will will qualifying offer」,我知道所有這些密鑰都是什麼,但並不是每個玩家都有數據輸入。)

我的策略是選擇列表中的第一位玩家,並開始從那裏抓取兄弟元素。如果兄弟元素的文本與我已知的某個鍵(「真實年」等)匹配,則存儲該數字值。如果兄弟元素是一個具有名稱屬性的元素,那麼我知道它是下一個玩家並轉到循環的下一次迭代。

我很好奇其他人會如何解決這個問題。我覺得我的方式笨重,但這是我能想象的唯一方法,沒有更多的HTML頁面結構。

我正在使用python和lxml.html模塊。

回答

2

聽起來好像這是一次性工作,並且html沒有很好的解析格式,所以你不應該花太多精力去編寫這個網頁的完美解析器。快速和骯髒的是要走的路。

更簡單的解決方案是簡單地複製頁面文本,將其粘貼到您選擇的文本編輯器中,並將其另存爲純文本文件。然後您可以編寫腳本來解析文本文件。

尋找以'#'開頭的行。這表示新玩家的部分的開始。然後消耗這些線,直到下一個玩家的部分開始。

+0

同意我不會花太多時間在它上面。我只是好奇,有興趣將此作爲一種學習情境。你對文本編輯器的建議是顯而易見的,謝謝! –

相關問題