【问题标题】:how to extract data from a scraped page that doesn't have a lot of structure如何从没有很多结构的抓取页面中提取数据
【发布时间】:2013-11-01 04:20:58
【问题描述】:

我想对我刚刚在棒球统计网站上阅读的帖子进行一些分析。有问题的页面位于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 美元”的数据。 (注意:其他一些玩家有不同的数据键,例如,“Will accept qualifying offer”。我知道所有这些键是什么,但不是每个玩家都有每个数据条目。)

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

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

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

【问题讨论】:

    标签: python html web-scraping lxml


    【解决方案1】:

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

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

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

    【讨论】:

    • 同意我不会花太多时间在上面。我只是好奇,有兴趣将其用作学习情况。您对文本编辑器的建议是显而易见的,非常棒,谢谢!
    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多