【问题标题】:REGEX extract information from EDGAR SC-13 formREGEX 从 EDGAR SC-13 表格中提取信息
【发布时间】:2020-04-19 04:01:22
【问题描述】:

我正在尝试从最新的SEC EDGAR Schedule 13 forms 文件中提取信息。

以备案链接为例:

1)Saba Capital_27-Dec-2019_SC13

我试图提取的信息(以及包含该信息的归档部分)

1) 报告人姓名:Saba Capital Management, L.P.

<p style="margin-bottom: 0pt;">NAME OF REPORTING PERSON</p>
<p style="margin-top: 0pt; margin-left: 18pt;">Saba Capital Management GP, LLC<br><br/>  

2) 发行人名称:WESTERN ASSET HIGH INCOME FUND II INC

<p style="text-align: center;"><b><font size="5"><u>WESTERN ASSET HIGH INCOME FUND II INC.</u></font><u><br/></u>(Name of Issuer)</b>

3) CUSIP 号码:95766J102(设法获得)

<p style="text-align: center;"><b><u>95766J102<br/></u>(CUSIP Number)</b>   

4) 以数量表示的班级百分比:11.3%(设法获得)

<p style="margin-bottom: 0pt;">PERCENT OF CLASS REPRESENTED BY AMOUNT IN ROW (11)</p>
<p style="margin-top: 0pt; margin-left: 18pt;">11.3%<br><br/>

5) 需要提交本声明的事件日期:2019 年 12 月 24 日

<p style="text-align: center;"><b><u>December 24, 2019<br/></u>(Date of Event Which Requires Filing of This Statement)</b> 

import requests 
import re
from bs4 import BeautifulSoup

page = requests.get('https://www.sec.gov/Archives/edgar/data/1058239/000106299319004848/formsc13da.htm')
soup = BeautifulSoup(page.text, 'xml')

## get CUSIP number
CUSIP = re.findall(r'[0-9]{3}[a-zA-Z0-9]{2}[a-zA-Z0-9*@#]{3}[0-9]', soup.text)

### get % 
regex = r"(?<=PERCENT OF CLASS|Percent of class)(.*)(?=%)"
percent = re.findall(r'\d+.\d+', re.search(regex, soup.text, re.DOTALL).group().split('%')[0])

如何从归档中提取这 5 条信息?在此先感谢

【问题讨论】:

  • CUSIP = soup.select("body &gt; document &gt; type &gt; sequence &gt; filename &gt; description &gt; text &gt; p:nth-child(9) &gt; b &gt; u")get_text()
  • 请确认所有项目是否在相同位置,以防您将代码应用于多个页面。
  • 在任何情况下我都不会对 html 使用正则表达式(四处搜索以了解原因)。最简单的方法是使用 xpath,这需要使用 lxml 而不是 beautifulsoup。我有兴趣,我可以发布答案。
  • @αԋɱҽԃαмєяιcαη 我不认为所有的项目都在同一个位置。是的,我想将它应用到其他页面
  • @JackFleeting 是的,请

标签: python regex beautifulsoup finance edgar


【解决方案1】:

尝试以下代码来获取所有值。使用find() 和css选择器select_one()

import requests
import re
from bs4 import BeautifulSoup

page = requests.get('https://www.sec.gov/Archives/edgar/data/1058239/000106299319004848/formsc13da.htm')
soup = BeautifulSoup(page.text, 'lxml')
NameReportingperson=soup.find('p', text=re.compile('NAME OF REPORTING PERSON')).find_next('p').text.strip()
print(NameReportingperson)
NameOftheIssuer=soup.select_one('p:nth-child(7) > b u').text.strip()
print(NameOftheIssuer)
CUSIP=soup.select_one("p:nth-child(9) > b > u").text.strip()
print(CUSIP)
percentage=soup.find('p', text=re.compile('PERCENT OF CLASS REPRESENTED BY AMOUNT IN ROW')).find_next('p').text.strip()
print(percentage)
Dateof=soup.select_one("p:nth-child(11) > b > u").text.strip()
print(Dateof)

输出

Saba Capital Management, L.P.
WESTERN ASSET HIGH INCOME FUND II INC.
95766J102
11.3%
December 24, 2019

更新


如果您不想使用位置,请尝试以下一个。

import requests
import re
from bs4 import BeautifulSoup

page = requests.get('https://www.sec.gov/Archives/edgar/data/1058239/000106299319004848/formsc13da.htm')
soup = BeautifulSoup(page.text, 'lxml')
NameReportingperson=soup.find('p', text=re.compile('NAME OF REPORTING PERSON')).find_next('p').text.strip()
print(NameReportingperson)
NameOftheIssuer=soup.select_one('p:contains(Issuer)').find_next('u').text.strip()
print(NameOftheIssuer)
CUSIP=soup.select_one('p:contains(CUSIP)').find_next('u').text.strip()
print(CUSIP)
percentage=soup.find('p', text=re.compile('PERCENT OF CLASS REPRESENTED BY AMOUNT IN ROW')).find_next('p').text.strip()
print(percentage)
Dateof=soup.select_one('p:contains(Event)').find_next('u').text.strip()
print(Dateof)

输出

Saba Capital Management, L.P.
WESTERN ASSET HIGH INCOME FUND II INC.
95766J102
11.3%
December 24, 2019

更新 2:

import requests
import re
from bs4 import BeautifulSoup
page = requests.get('https://www.sec.gov/Archives/edgar/data/1058239/000106299319004848/formsc13da.htm')
soup = BeautifulSoup(page.text, 'lxml')
NameReportingperson=soup.find('p', text=re.compile('NAME OF REPORTING PERSON')).find_next('p').text.strip()
print(NameReportingperson)
NameOftheIssuer=soup.select_one('p:nth-of-type(7) > b u').text.strip()
print(NameOftheIssuer)
CUSIP=soup.select_one("p:nth-of-type(9) > b > u").text.strip()
print(CUSIP)
percentage=soup.find('p', text=re.compile('PERCENT OF CLASS REPRESENTED BY AMOUNT IN ROW')).find_next('p').text.strip()
print(percentage)
Dateof=soup.select_one("p:nth-of-type(11) > b > u").text.strip()
print(Dateof)

【讨论】:

  • 我无法为发行人名称、CUSIP 和工作日期获取 soup.select_one。如果物品的位置发生变化,这3个可能无法正常工作?
  • 是的,如果项目的位置发生变化,您将无法获得。
  • NotImplementedError Traceback(最近一次调用最后) in () ----> 9 NameOftheIssuer=soup.select_one('p:contains(Issuer) ').find_next('u').text.strip() /usr/local/lib/python3.6/dist-packages/bs4/element.py in select(self, selector, _candidate_generator, limit) 1526 else: 1527 raise NotImplementedError( -> 1528 '只实现了以下伪类:nth-​​of NotImplementedError: 只实现了以下伪类:nth-​​of-type.
  • 好的,你的问题将 nth-child 替换为 nth-of-type
  • 我应该如何改变它?
【解决方案2】:

使用 lxml,它应该这样工作:

import requests
import lxml.html

url = 'https://www.sec.gov/Archives/edgar/data/1058239/000106299319004848/formsc13da.htm'
source = requests.get(url)

doc = lxml.html.fromstring(source.text)
name = doc.xpath('//p[text()="NAME OF REPORTING PERSON"]/following-sibling::p/text()')[0]
issuer = doc.xpath('//p[contains(text(),"(Name of Issuer)")]//u/text()')[0]
cusip = doc.xpath('//p[contains(text(),"(CUSIP Number)")]//u/text()')[0]
perc = doc.xpath('//p[contains(text(),"PERCENT OF CLASS REPRESENTED")]/following-sibling::p/text()')[0]
event = doc.xpath('//p[contains(text(),"(Date of Event Which Requires")]//u/text()')[0]

输出:

Saba Capital Management, L.P.
WESTERN ASSET HIGH INCOME FUND II INC.
95766J102
11.3%
December 24, 2019

【讨论】:

  • 这适用于此页面。你能解释一下我如何申请其他页面(来自相同类型的文件)例如:sec.gov/Archives/edgar/data/1061983/000089914019000648/…
  • @Lko - 不幸的是,这正是解析 EDGAR 文件的主要问题之一。 SEC 不需要统一的 edgarization 方法,因此每个申报者对其文件的 edgarize(或 edgarization 服务提供商所做的)都不同。在许多情况下,来自同一个文件管理器的文件使用相同的 edgarization 格式,但您仍然需要对文件进行一些手动检查以找出隐藏的位置......
  • ic,你能解释一下 '//u/text()' 和 '/following-sibling::p/text()' 或任何我能找到更多信息的资源吗?
  • @Lko - 有很多关于 xpath 的信息,尽管可能需要一段时间才能掌握。好的起点是:w3schools.com/xml/xpath_intro.asp
猜你喜欢
  • 2020-07-17
  • 2012-12-15
  • 1970-01-01
  • 2011-06-08
  • 2014-10-25
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 2018-06-27
相关资源
最近更新 更多