从不同的 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 表中提取数据的主要内容,如果未能解决你的问题,请参考以下文章