从不同的 HTML 表中提取数据

Posted

技术标签:

【中文标题】从不同的 HTML 表中提取数据【英文标题】:extracting data from diverse HTML tables 【发布时间】:2012-10-19 17:44:57 【问题描述】:

我正在尝试从 Edgar 数据库 (http://www.sec.gov/edgar/searchedgar/companysearch.html) 的 8-K 形式的损益表中提取数据。以下是一些示例:

Apple

Alcoa

我要抓取的表格称为“运营报表”或“收入报表”或类似名称。我尝试提取所有数据(如净销售额、营业收入等)并根据日期和时间间隔(三个月、六个月等)将其放入字典中。问题是表结构的高度多样性 - 可以通过多种方式构建此类数据。我创建了一个使用 Beautiful Soup 解析表格的脚本,但它变得庞大而复杂。我想知道是否有任何方法可以在没有大量编码的情况下立即获得它(具有所有复杂性)?我尝试使用 Excel 和 Google Docs 自动获取数据,但在这种情况下它们表现不佳。有什么建议? 感谢您的帮助

【问题讨论】:

【参考方案1】:

我想我会先使用 BeautifulSoup 将所有表放入一个简单的数据结构中,然后尝试提取您想要的内容。您提供的两个示例页面不包含任何 <th> 元素,因此对于那些,您可以像这样处理基本提取:

from BeautifulSoup import BeautifulSoup

def tables(html):
    """Extract all tables from `html`."""
    soup = BeautifulSoup(html)
    return [[
            [cell.text for cell in row.findAll("td")]
            for row in table.findAll("tr")]
        for table in soup.findAll("table")]

...这将为您提供一个表格列表,每个表格是一个行列表,每个行都是一个单元格列表。

警告:如果周围有嵌套表,上面的代码很可能会出错。

您也可以通过更改一行来获得<th> 元素...

            [cell.text for cell in row.findAll(["td", "th"])]

...但是您显然会失去<th><td> 单元格之间的区别。鉴于您的源材料的状态,这可能不会造成太大的损失。

实际上,以编程方式从那里获取您需要的内容是另一回事...您最好将每个表转储到 CSV 文件中,然后通过电子表格应用程序进行处理。

【讨论】:

以上是关于从不同的 HTML 表中提取数据的主要内容,如果未能解决你的问题,请参考以下文章

我如何提取合并的数据并将其放入不同的工作表中?

如何从表中提取行,用不同的值过滤同一列?

是否可以从 XMLSchema 形成的表中提取特定数据?

从网站表中提取数据

Java:从网站表中提取数据

如何从具有相同类的页面中的两个表中提取数据?