【问题标题】:How to Scrape data hidden inside of a collapsible element?如何抓取隐藏在可折叠元素内的数据?
【发布时间】:2021-11-07 12:18:43
【问题描述】:

我正在从site 中抓取数据,我想从 Selected Filings 部分下的可折叠内容中提取标签超链接数据。在我的代码中,我使用 find_all() [divs] 和 selected-filings-annualOrQuarterly 的 [id],首先选择它们所在的 div。

from bs4 import BeautifulSoup
import requests
r = requests.get("https://www.sec.gov/edgar/browse/?CIK=0001084869", headers={'user-agent': 'Mozilla/5.0'}) soup = BeautifulSoup(r.content, 'html.parser')
print(r.status_code) 
print(r.url)
for div_tag in soup.find_all('div', {"id" : "selected-filings-annualOrQuarterly"}):
    print(div_tag)
    for ul_tag in div_tag.find_all('ul'):
        print(i)
        for li_tag in ul_tag.find_all('li'):
            print(li_tag)
            for a_tag in li_tag.find_all('a', href=True):
                print(a_tag)

这些是我得到的结果:

200
https://www.sec.gov/edgar/browse/?CIK=0001084869
-


该公司去年没有提交 10-K/10-Q 文件

每当我运行上述代码时,我只会在 [div - id] 中获取 [span] 元素,仅此而已。 我真正想要的是获取指定 [div] 元素中存在的所有链接(标签),在 [li] [ul] 元素内。当我查看该网站的页面源时,一切都在那里。但是代码甚至不返回 [div] 内的 [ul] 和 [li] 标签。似乎它们是隐藏的。这是 a 标签超链接的顺序和位置。 id(上面指定) > ul > li > a(要抓取的链接)

我预期的结果:


根据找到的链接数量,返回的链接数量会有所不同。我怎样才能获得所述位置内的超链接?

【问题讨论】:

  • 您到底想检索什么?例如,公司所有 10-K 文件的 url?
  • 是的@Jack Fleeting。我要检索的是最近的 10-k、10-Q 或 8-K 的链接/网址。此代码将每天运行并查找最近/更新的信息。

标签: python web-scraping beautifulsoup


【解决方案1】:

当我查看该网站的页面源代码时

inspector 不是源,那是修改后的页面。来源是ctrl+u,您会看到您的数据不在此处。

您想要的数据是一个 json,您可以在网络选项卡中看到:https://data.sec.gov/submissions/CIK0001084869.json

我在 cmets 中看到您也想要 8-K 表单,因此我对内容进行了一些重构以使脚本更加通用。 我添加了一个随机 cik 来进行一些测试。所有数据现在都在一个字典中

import requests
from collections import defaultdict
headers={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0'}

ciklist=['0001084869','0001856236']
search_forms=['10-Q', '10-K', '8-K', '8-K/A']

cik_data={}
for cik in ciklist:
    data=requests.get(f'https://data.sec.gov/submissions/CIK{cik}.json', headers=headers).json()
    base_url=f'https://sec.gov/ix?doc=/Archives/edgar/data/{cik[3:]}'
    cik_data[cik]=defaultdict(list)
    for i, form in enumerate(data['filings']['recent']['form']):
        if form in search_forms:
            fname=data['filings']['recent']['primaryDocument'][i]
            access_number=data['filings']['recent']['accessionNumber'][i]
            access_number=''.join(access_number.split('-'))
            cik_data[cik][form].append('/'.join([base_url, access_number, fname]))

【讨论】:

  • 感谢@diggusbicus!我想知道如何获取这些数据和链接所在的 json。我还意识到返回的链接只是整个链接的最后一段。例如,其中一个链接是 [sec.gov/ix?doc=/Archives/edgar/data/1084869/000143774921025463/…,但返回的是最后一个反斜杠 flws20210926_10q.htm 之后的段。有没有办法特别从这个位置返回它 ix?doc=/...... (第一个反斜杠)?谢谢
  • 你是对的,有一个技巧。我觉得现在可以了
  • 感谢@diggusbickus,它现在工作得更好了。我只想知道如何获取页面的 json,因为我还有许多其他页面要处理。
  • 这只是cik号码。你的网址是https://www.sec.gov/edgar/browse/?CIK=0001084869 而json 是https://data.sec.gov/submissions/CIK0001084869.json ?
  • 谢谢,我也想从其他文件/页面中获取数据,看来我会使用 json。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 2016-04-05
相关资源
最近更新 更多