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 美元”的数据。(注意:其他一些玩家有不同的数据键,例如,“将接受合格的报价”。我知道所有这些键是什么,但不是每个玩家都有每个数据条目。)

我的策略是选择列表中的第一个玩家,然后从那里开始抓取兄弟元素。如果兄弟元素的文本与我的已知键之一(“真实年份”等)匹配,则存储其数值。如果兄弟元素是<a>具有 name 属性的元素,那么我知道它是下一个玩家并进入循环的下一个迭代。

我很好奇其他人会如何处理这个问题。我觉得我的方式很笨拙,但这是我能想象的唯一一种方法,页面没有更多的 html 结构。

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

4

1 回答 1

2

听起来这是一次性的工作,而且 html 的解析格式并不好,所以你不应该花太多精力来为这个网页编写完美的解析器。快速和肮脏是要走的路。

一个更简单的解决方案是简单地复制页面文本,将其粘贴到您选择的文本编辑器中,然后将其保存为纯文本文件。然后,您可以编写一个脚本来解析文本文件。

查找以“#”开头的行。这表示新玩家部分的开始。然后使用这些行,直到下一个玩家的部分开始。

于 2013-10-23T04:00:46.217 回答