首页 > 解决方案 > 如何 Web 抓取 SEC Edgar 10-K 动态数据

问题描述

我们正在尝试使用 Python 解析 SEC Edgar 文件。我正在尝试在第 21 行获取此表“按业务部门划分的销售额”。这是文档的链接。

https://www.sec.gov/ix?doc=/Archives/edgar/data/200406/000020040621000057/jnj-20210704.htm

下面是我们在网上找到的代码。网页中的所有数据都在这个标签下。

<div id="dynamic-xbrl-form" class="position-relative">

我们无法打印此数据。

在此处输入图像描述

from bs4 import BeautifulSoup
import requests
import sys

# Access page
cik = '200406'
type = '10-K'
dateb = '20210704'

# 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')
print(soup)

任何人都可以帮助我们得到这个。任何建议都是有帮助的。

标签: beautifulsoupedgarsec

解决方案


首先

您需要以正确的方式使用 f 字符串,阅读这篇文章以了解有关 f 字符串的更多信息

正确的代码:

# Obtain HTML for search page
base_url = f"https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK={cik}&type={type}&dateb={dateb}"
edgar_resp = requests.get(base_url)

第二

响应对象返回 403 表示被禁止访问,您可以阅读这篇文章以了解更多关于状态码的信息,要解决此问题,您需要用户代理标头

代码应该是这样的:

from bs4 import BeautifulSoup
import requests
import sys
from fake_useragent import UserAgent

ua = UserAgent()
headers = ua.random

# Access page
cik = '200406'
type = '10-K'
dateb = '20210704'

# Obtain HTML for search page
base_url = f"https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK={cik}&type={type}&dateb={dateb}"
edgar_resp = requests.get(base_url)

print (edgar_resp)
edgar_str = edgar_resp.text

# Find the document link
doc_link = ''
soup = BeautifulSoup(edgar_str, 'html.parser')
# now you can use BeautifulSoup to find you data 
#print(soup)

您需要安装 fake-useragent 库

pip install fake-useragent

您可以阅读此主题以了解有关 fake-useragent 的更多信息

之后,您可以使用 beutifulsoup 提取您需要的数据,您可以阅读这篇文章以了解更多信息。


推荐阅读