以自动组织的方式将余额 Sheet 从 SEC 导入 Dataframe

Import Balance Sheet in an automatic organized manner from SEC to Dataframe

我正在考虑为任何使用 Beautiful Soup 的公司自动并正确组织余额 Sheet 数据。

我不打算获取每个变量,而是获取整个余额 sheet。最初,我试图做很多代码来为我选择的特定公司提取 URL。

例如,假设我想从以下 URL:

中获取余额 Sheet 数据
URL1:'https://www.sec.gov/Archives/edgar/data/1418121/000118518520000213/aple20191231_10k.htm'

或来自

URL2:'https://www.sec.gov/Archives/edgar/data/1326801/000132680120000046/form8-k03312020earnings.htm'

我正在尝试编写一个函数(假设它被称为 get_balancesheet(URL) ),这样无论 URL 是什么,您都将获得包含余额 sheet 的数据框有组织的方式。

# Import libraries
import requests
import re
from bs4 import BeautifulSoup

我编写了以下需要大量改进的函数

def Get_Data_Balance_Sheet(url):
    page = requests.get(url)

    # Create a BeautifulSoup object
    soup = BeautifulSoup(page.content)
    futures1 = soup.find_all(text=re.compile('CONSOLIDATED BALANCE SHEETS'))

    Table=[]
    for future in futures1:
        for row in future.find_next("table").find_all("tr"):
            t1=[cell.get_text(strip=True) for cell in row.find_all("td")]
            Table.append(t1)
    # Remove list from list of lists if list is empty
    Table = [x for x in Table if x != []]
    return Table

然后我执行下面的

url='https://www.sec.gov/Archives/edgar/data/1326801/000132680120000013/fb-12312019x10k.htm'
Tab=Get_Data_Balance_Sheet(url)
Tab

请注意,这不是我打算拥有的它不仅仅是将它放入数据框中,而是我们需要对其进行更改,以便无论 URL 我们都能获得余额 Sheet.

嗯,这就是 EDGAR,这不会很简单,但它是可行的。

首先要做的是 - 使用 CIK,您可以提取 CIK 文件管理器在特定时期内生成的特定类型的特定文件。因此,假设您对 CIK 申报人在 2019 年至 2020 年间提交的原始或修订的 10-K 和 10-Q 表格(例如“FORM 10-K/A”)感兴趣。

start = 2019
end = 2020
cik = 220000320193
short_cik = str(cik)[-6:] #we will need it later to form urls

首先,我们需要获取满足这些条件的申请列表并将其加载到 beautifulsoup:

import requests
from bs4 import BeautifulSoup as bs 
url = f"https://www.sec.gov/cgi-bin/srch-edgar?text=cik%3D%{cik}%22+AND+form-type%3D(10-q*+OR+10-k*)&first={start}&last={end}"
req = requests.get(url)
soup = bs(req.text,'lxml')

有 8 份文件符合标准:2 份 10-K 表格和 6 份 10-Q 表格。这些申请中的每一个都有一个登录号。入藏号隐藏在每个文件的 url 中,我们需要提取它以到达实际目标 - Excel 文件,其中包含每个特定文件所附的财务报表。

acc_nums = []
for link in soup.select('td>a[href]'):
    target = link['href'].split(short_cik,1)    
    if len(target)>1:
        acc_num = target[1].split('/')[1]
        if not acc_num in acc_nums: #we need this filter because each filing has two forms: text and html, with the same accession number
            acc_nums.append(acc_num)

此时,acc_nums 包含这 8 份申请中每一份的入藏号。我们现在可以下载目标 Excel 文件。显然,您可以遍历 acc_num 并下载所有 8 个文件,但假设您只是(随机地)寻找附加到第三个文件的 Excel 文件:

fs_url = f"https://www.sec.gov/Archives/edgar/data/{short_cik}/{acc_nums[2]}/Financial_Report.xlsx"
fs = requests.get(fs_url)
with open('random_edgar.xlsx', 'wb') as output:
    output.write(fs.content)

届时您将获得比您想知道的更多有关 Apple 财务状况的信息...