21

有没有人在抓取 SEC 10-K 和 10-Q 文件方面有经验?我在试图从这些文件中提取每月实现的股票回购时遇到了困难。具体来说,我想获得以下信息: 1. 期间;2. 购买的股份总数;3. 每股平均支付价格;4. 作为公开宣布的计划或计划的一部分购买的股份总数;5. 2004 年至 2014 年每个月在计划或计划下可能购买的股票的最大数量(或近似美元价值)。我总共有 90,000 多个表格要解析,所以这样做是不可行的手动。

此信息通常在 10-K 中的“第 2 部分第 5 项注册人的普通股、相关股东事项和发行人购买股票的市场”和“第 2 部分第 2 项未注册的股票出售和收益使用”下报告。

这是我需要解析的 10-Q 文件的一个示例: https ://www.sec.gov/Archives/edgar/data/12978/000104746909007169/a2193892z10-q.htm

如果公司没有股票回购,则季度报告中可能会缺少此表。

我曾尝试用 Python BeautifulSoup 解析 html 文件,但结果并不理想,主要是因为这些文件不是以一致的格式编写的。

例如,我能想到的解析这些表单的唯一方法是

from bs4 import BeautifulSoup
import requests
import unicodedata
import re

url='https://www.sec.gov/Archives/edgar/data/12978/000104746909007169/a2193892z10-q.htm'

def parse_html(url):
    r = requests.get(url)
    soup = BeautifulSoup(r.content, 'html5lib')
    tables = soup.find_all('table') 

    identifier = re.compile(r'Total.*Number.*of.*Shares.*\w*Purchased.*', re.UNICODE|re.IGNORECASE|re.DOTALL)

    n = len(tables) -1
    rep_tables = []

    while n >= 0:
        table = tables[n]
        remove_invalid_tags(table)
        table_text = unicodedata.normalize('NFKD', table.text).encode('ascii','ignore')
        if re.search(identifier, table_text):
            rep_tables += [table]
            n -= 1
        else:
            n -= 1

    return rep_tables

def remove_invalid_tags(soup, invalid_tags=['sup', 'br']):
    for tag in invalid_tags:
        tags = soup.find_all(tag)
        if tags:
            [x.replaceWith(' ') for x in tags]

上面的代码只返回了可能包含回购信息的乱码。但是,1)不可靠;2)速度很慢;3) 以下步骤来抓取日期/月份、股价和股数等要痛苦得多。我想知道是否有更多可行的语言/方法/应用程序/数据库来获取此类信息?太感谢了!

4

1 回答 1

9

我不确定 python,但在 R 中有一个使用“finstr”包(https://github.com/bergant/finstr)的漂亮解决方案。'finstr' 使用 XBRL 格式自动从 EDGAR 中提取财务报表(损益表、资产负债表、现金流量等)。

于 2016-06-01T03:10:39.220 回答