【问题标题】:Need help retreiving the first occurence of something with beautiful soup and python需要帮助用美丽的汤和蟒蛇检索第一次出现的东西
【发布时间】:2020-07-02 17:52:26
【问题描述】:

我正在尝试搜索 SEC 网站以查找第一次出现的“10-Q”或“10-K”,并检索网站上“交互式数据按钮”下的链接。

我试图从中检索链接的网址是:

https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=AAPL&type=&dateb=20200506&owner=exclude&count=40

结果链接应该是:

https://www.sec.gov/cgi-bin/viewer?action=view&cik=320193&accession_number=0000320193-20-000052&xbrl_type=v

我目前使用的代码:

import requests
from bs4 import BeautifulSoup

date1 = "20200506"
ticker = "AAPL"

URL = 'https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=' + ticker + '&type=&dateb=' + 
date1 + '&owner=exclude&count=40'
page = requests.get(URL)

soup = BeautifulSoup(page.content, 'html.parser')

results = soup.find(id='seriesDiv')

rows = results.find_all('tr')

for row in rows:
    document = row.find('td', string='10-Q')
    link = row.find('a', id="interactiveDataBtn")
    if None in (document, link):
        continue
    print(document.text)
    print(link['href'])

此代码返回 10-Q 的所有链接,但它应该适用于 10-Q 和 10-K。

有人可以帮我修改这段代码,让它只返回第一次出现 10-Q 或 10-K 的链接吗?

谢谢

【问题讨论】:

    标签: python python-3.x beautifulsoup


    【解决方案1】:

    最快的解决方案是在.find()方法中使用lambda。

    例如:

    import requests
    from bs4 import BeautifulSoup
    
    date1 = "20200506"
    ticker = "AAPL"
    
    URL = 'https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=' + ticker + '&type=&dateb=' + date1 + '&owner=exclude&count=40'
    page = requests.get(URL)
    
    soup = BeautifulSoup(page.content, 'html.parser')
    
    results = soup.find(id='seriesDiv')
    rows = results.find_all('tr')
    
    for row in rows:
        document = row.find(lambda t: t.name=='td' and ('10-Q' in t.text or '10-K' in t.text))
        link = row.find('a', id="interactiveDataBtn")
        if None in (document, link):
            continue
        print(document.text)
        print('https://www.sec.gov' + link['href'])
    

    同时打印10-Q10-K 链接:

    10-Q
    https://www.sec.gov/cgi-bin/viewer?action=view&cik=320193&accession_number=0000320193-20-000052&xbrl_type=v
    10-Q
    https://www.sec.gov/cgi-bin/viewer?action=view&cik=320193&accession_number=0000320193-20-000010&xbrl_type=v
    10-K
    https://www.sec.gov/cgi-bin/viewer?action=view&cik=320193&accession_number=0000320193-19-000119&xbrl_type=v
    10-Q
    https://www.sec.gov/cgi-bin/viewer?action=view&cik=320193&accession_number=0000320193-19-000076&xbrl_type=v
    10-Q
    https://www.sec.gov/cgi-bin/viewer?action=view&cik=320193&accession_number=0000320193-19-000066&xbrl_type=v
    

    编辑:要只获得第一次出现,您可以使用字典。每次迭代检查字典中是否有键(字符串10-Q10-K),如果没有,添加它:

    links = dict()
    for row in rows:
        document = row.find(lambda t: t.name=='td' and ('10-Q' in t.text or '10-K' in t.text))
        link = row.find('a', id="interactiveDataBtn")
        if None in (document, link):
            continue
        if document.text not in links:
            links[document.text] = 'https://www.sec.gov' + link['href']
    
    print(links)
    

    打印:

    {'10-Q': 'https://www.sec.gov/cgi-bin/viewer?action=view&cik=320193&accession_number=0000320193-20-000052&xbrl_type=v', 
     '10-K': 'https://www.sec.gov/cgi-bin/viewer?action=view&cik=320193&accession_number=0000320193-19-000119&xbrl_type=v'}
    

    【讨论】:

    • 感谢您的回复。这确实过滤了 10-Q 和 K,太棒了,谢谢。现在,您能否向我解释一下如何才能检索到仅第一次出现的链接?可能会解析为列表或其他内容,但无法理解它
    • @Jackey12345 我更新了我的答案 - 您可以使用字典来跟踪您发现第一次出现 10-Q/10-K 的信息。
    • 非常感谢,这太棒了,它就像一个魅力!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多