如何使用美丽的汤来刮掉SEC的Edgar数据库并接收欲望数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用美丽的汤来刮掉SEC的Edgar数据库并接收欲望数据相关的知识,希望对你有一定的参考价值。
为长期问题提前道歉 - 我是Python的新手,我试图在相当具体的情况下尽可能明确。
我试图在常规的基础上确定来自SEC Filings的具体数据点,但我想自动化这一点,而不必手动搜索公司CIK ID和表格备案。到目前为止,我已经能够到达下载有关SEC在给定时间段内收到的所有文件的元数据的地步。它看起来像这样:
index cik conm type date path
0 0 1000045 NICHOLAS FINANCIAL INC 10-Q 2019-02-14 edgar/data/1000045/0001193125-19-039489.txt
1 1 1000045 NICHOLAS FINANCIAL INC 4 2019-01-15 edgar/data/1000045/0001357521-19-000001.txt
2 2 1000045 NICHOLAS FINANCIAL INC 4 2019-02-19 edgar/data/1000045/0001357521-19-000002.txt
3 3 1000045 NICHOLAS FINANCIAL INC 4 2019-03-15 edgar/data/1000045/0001357521-19-000003.txt
4 4 1000045 NICHOLAS FINANCIAL INC 8-K 2019-02-01 edgar/data/1000045/0001193125-19-024617.txt
尽管拥有所有这些信息,以及能够下载这些文本文件并查看基础数据,我无法解析这些数据,因为它是xbrl格式,并且有点超出我的驾驶室。相反,我遇到了这个脚本(从这个网站https://www.codeproject.com/Articles/1227765/Parsing-XBRL-with-Python提供):
from bs4 import BeautifulSoup
import requests
import sys
# Access page
cik = '0000051143'
type = '10-K'
dateb = '20160101'
# Obtain html for search page
base_url = "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK={}&type={}&dateb={}"
edgar_resp = requests.get(base_url.format(cik, type, dateb))
edgar_str = edgar_resp.text
# Find the document link
doc_link = ''
soup = BeautifulSoup(edgar_str, 'html.parser')
table_tag = soup.find('table', class_='tableFile2')
rows = table_tag.find_all('tr')
for row in rows:
cells = row.find_all('td')
if len(cells) > 3:
if '2015' in cells[3].text:
doc_link = 'https://www.sec.gov' + cells[1].a['href']
# Exit if document link couldn't be found
if doc_link == '':
print("Couldn't find the document link")
sys.exit()
# Obtain HTML for document page
doc_resp = requests.get(doc_link)
doc_str = doc_resp.text
# Find the XBRL link
xbrl_link = ''
soup = BeautifulSoup(doc_str, 'html.parser')
table_tag = soup.find('table', class_='tableFile', summary='Data Files')
rows = table_tag.find_all('tr')
for row in rows:
cells = row.find_all('td')
if len(cells) > 3:
if 'INS' in cells[3].text:
xbrl_link = 'https://www.sec.gov' + cells[2].a['href']
# Obtain XBRL text from document
xbrl_resp = requests.get(xbrl_link)
xbrl_str = xbrl_resp.text
# Find and print stockholder's equity
soup = BeautifulSoup(xbrl_str, 'lxml')
tag_list = soup.find_all()
for tag in tag_list:
if tag.name == 'us-gaap:stockholdersequity':
print("Stockholder's equity: " + tag.text)
只是运行这个脚本正是我喜欢它的方式。它返回给定公司的股东权益(在这种情况下为IBM),然后我可以获取该值并将其写入excel文件。
我的两部分问题是:
- 我从上面的原始元数据表中取出了三个相关列(CIK,类型和日期)并将其写入元组列表 - 我认为这就是它所谓的 - 它看起来像这样[(''1009759','D', '20190215'),(''1009891','D','20190206'),...])。我如何获取这些数据,替换我找到的脚本的初始部分,并有效地循环它,以便最终得到每个公司,文件和日期的所需值列表?
- 通常有更好的方法吗?我认为会有某种API或python包来查询我感兴趣的数据。我知道Form 10-Ks和Form 10-Qs有一些高级信息但是我在Form中Ds有点模糊。我只是想确保我有效地利用我的时间来获得最佳解决方案。
感谢您的帮助!
您需要定义一个函数,该函数基本上可以是您发布的大多数代码,并且该函数应该使用3个关键字参数(您的3个值)。然后,您只需传入这些值并返回结果,而不是在代码中定义三个值。
然后你获取你创建的列表,并围绕它创建一个简单的循环来调用你用这三个值定义的函数,然后对结果做一些事情。
def get_data(value1, value2, value3):
# your main code here but replace with your arguments above.
return content
for company in companies:
content = get_data(value1, value2, value3)
# do something with content
假设您的数据框sec
具有正确命名的列,用于上面的文件列表,您首先需要从数据框中提取相关信息到三个列表中:
cik = list(sec['cik'].values)
dat = list(sec['date'].values)
typ = list(sec['type'].values)
然后创建base_url,插入项目并获取数据:
for c, t, d in zip(cik, typ, dat):
base_url = f"https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK={c}&type={t}&dateb={d}"
edgar_resp = requests.get(base_url)
从那里开始。
以上是关于如何使用美丽的汤来刮掉SEC的Edgar数据库并接收欲望数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 python re.compile 和漂亮的汤来匹配一个字符串