Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 以自动组织的方式将资产负债表从SEC导入Dataframe_Python 3.x_Beautifulsoup_Request_Finance - Fatal编程技术网

Python 3.x 以自动组织的方式将资产负债表从SEC导入Dataframe

Python 3.x 以自动组织的方式将资产负债表从SEC导入Dataframe,python-3.x,beautifulsoup,request,finance,Python 3.x,Beautifulsoup,Request,Finance,我正在考虑为任何使用BeautifulSoup的公司自动、正确地组织资产负债表数据 我不打算得到每个变量,而是整个资产负债表。最初,我尝试编写许多代码来提取我选择的特定公司的URL 例如,假设我想从以下URL获取资产负债表数据: URL1:'https://www.sec.gov/Archives/edgar/data/1418121/000118518520000213/aple20191231_10k.htm' 或来自 URL2:'https://www.sec.gov/Archives/

我正在考虑为任何使用BeautifulSoup的公司自动、正确地组织资产负债表数据

我不打算得到每个变量,而是整个资产负债表。最初,我尝试编写许多代码来提取我选择的特定公司的URL

例如,假设我想从以下URL获取资产负债表数据:

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\u balancesheet(URL)
),这样无论URL是什么,您都将以有组织的方式获得包含资产负债表的数据框

# 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我们都可以得到资产负债表。

好吧,这是EDGAR,它不会很简单,但它是可行的

第一件事优先-使用CIK,您可以提取特定类型的特定文件,这些文件由CIK文件管理器在特定时期制作。假设您对该CIK申报人于2019年至2020年提交的表格10-K和10-Q(原件或修订版)(如“表格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份文件符合标准:两份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)

在那时,你将拥有比你想知道的更多的关于苹果公司财务状况的信息……

我认为你不可能做到你想做的事情,至少不能这样做。EDGAR文件在很多方面都很糟糕,其中之一就是缺乏统一的格式。因此,用一个Beautfulsoup脚本刮去所有文件可能是不可能的。但是,如果您同时拥有申报人的CIK和特定申报的登记号,您可以直接获得资产负债表。如果你没有,你必须按公司名称搜索EDGAR,归档类型和期限,并从中提取该期限内该类型每次归档的CIK和登录号。@JackFleeting因此,假设我有CIK号,即000032193,我如何才能获得该公司10-K的资产负债表?@rsc05您可以将Excel文件读入熊猫数据框,如下所述: