【问题标题】:extracting data from diverse HTML tables从不同的 HTML 表中提取数据
【发布时间】:2012-10-19 17:44:57
【问题描述】:
我正在尝试从 Edgar 数据库 (http://www.sec.gov/edgar/searchedgar/companysearch.html) 的 8-K 形式的损益表中提取数据。以下是一些示例:
Apple
Alcoa
我要抓取的表格称为“运营报表”或“收入报表”或类似名称。我尝试提取所有数据(如净销售额、营业收入等)并根据日期和时间间隔(三个月、六个月等)将其放入字典中。问题是表结构的高度多样性 - 可以通过多种方式构建此类数据。我创建了一个使用 Beautiful Soup 解析表格的脚本,但它变得庞大而复杂。我想知道是否有任何方法可以在没有大量编码的情况下立即获得它(具有所有复杂性)?我尝试使用 Excel 和 Google Docs 自动获取数据,但在这种情况下它们表现不佳。有什么建议?
感谢您的帮助
【问题讨论】:
标签:
python
html
html-table
【解决方案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 文件中,然后通过电子表格应用程序进行处理。