【问题标题】:Web scraping several a href网页抓取几个a href
【发布时间】:2021-04-05 00:24:53
【问题描述】:

我想用 Python 抓取这个页面:https://statusinvest.com.br/acoes/proventos/ibovespa

使用此代码:

import requests
from bs4 import BeautifulSoup as bs

URL = "https://statusinvest.com.br/acoes/proventos/ibovespa"

page = 1
req = requests.get(URL+str(page))
soup = bs(req.text, 'html.parser')
container = soup.find('div', attrs={'class','list'})
dividends = container.find('a')

for dividend in dividends:
  links = dividend.find_all('a')
 
 print(links)

但它不返回任何东西。

有人可以帮帮我吗?

【问题讨论】:

  • 欢迎来到 SO!请参阅:Why is “Can someone help me?” not an actual question?。你想在这里获取什么数据?几乎可以肯定,您想要的数据是通过 JS 注入的。见Web-scraping JavaScript page with Python
  • 你看过这个页面的源代码吗?数据全部存储在一个名为result 的隐藏<input> 标记中。 Javascript 代码动态扩展它以创建页面。由于您没有执行 Javascript,因此您不会看到它。但是,您也许可以通过阅读<input> 标签获得您想要的。

标签: python html web-scraping


【解决方案1】:

已编辑:您可以看到下面更新的代码来访问您在评论中提到的任何数据,您可以根据需要进行修改,因为该页面上的所有数据都在 data 变量中。

更新代码:

import json
import requests
from bs4 import BeautifulSoup as bs

url = "https://statusinvest.com.br"

links = []
req = requests.get(f"{url}/acoes/proventos/ibovespa")
soup = bs(req.content, 'html.parser')
data = json.loads(soup.find('input', attrs={'id': 'result'})["value"])
print("Date Com Data")
for datecom in data["dateCom"]:
    print(f"{datecom['code']}\t{datecom['companyName']}\t{datecom['companyNameClean']}\t{datecom['companyId']}\t{datecom['companyId']}\t{datecom['resultAbsoluteValue']}\t{datecom['dateCom']}\t{datecom['paymentDividend']}\t{datecom['earningType']}\t{datecom['dy']}\t{datecom['recentEvents']}\t{datecom['recentEvents']}\t{datecom['uRLClear']}")
print("\nDate Payment Data")
for datePayment in data["datePayment"]:
    print(f"{datePayment['code']}\t{datePayment['companyName']}\t{datePayment['companyNameClean']}\t{datePayment['companyId']}\t{datePayment['companyId']}\t{datePayment['resultAbsoluteValue']}\t{datePayment['dateCom']}\t{datePayment['paymentDividend']}\t{datePayment['earningType']}\t{datePayment['dy']}\t{datePayment['recentEvents']}\t{datePayment['recentEvents']}\t{datePayment['uRLClear']}")
print("\nProvisioned Data")
for provisioned in data["provisioned"]:
    print(f"{provisioned['code']}\t{provisioned['companyName']}\t{provisioned['companyNameClean']}\t{provisioned['companyId']}\t{provisioned['companyId']}\t{provisioned['resultAbsoluteValue']}\t{provisioned['dateCom']}\t{provisioned['paymentDividend']}\t{provisioned['earningType']}\t{provisioned['dy']}\t{provisioned['recentEvents']}\t{provisioned['recentEvents']}\t{provisioned['uRLClear']}")

查看该网站的源代码可以直接获取 json 并按照以下代码获取所需的链接。

代码:

import json
import requests
from bs4 import BeautifulSoup as bs

url = "https://statusinvest.com.br"

links=[]
req = requests.get(f"{url}/acoes/proventos/ibovespa")
soup = bs(req.content, 'html.parser')
data = json.loads(soup.find('input', attrs={'id': 'result'})["value"])
for datecom in data["dateCom"]:
    links.append(f"{url}{datecom['uRLClear']}")
for datePayment in data["datePayment"]:
    links.append(f"{url}{datePayment['uRLClear']}")
for provisioned in data["provisioned"]:
    links.append(f"{url}{provisioned['uRLClear']}")

print(links)

输出:

如果您有任何问题,请告诉我:)

【讨论】:

  • 很好的解决方案。但实际上我想提取 datecom、datepayment 和 provisioned 的所有值。有可能吗?
  • 看起来你误解了你可以看到它获取你可以运行的所有 3 种类型链接的代码,并查看在网站上找到并由 bot 当前输出的链接数为 42。如果我错了,请告诉我这里面的某个地方。
  • 是的。我问错问题了,抱歉。事实上,我想从各个字段中提取所有数据:股票、股息价值、数据 com、付款、类型和 DY。
  • 是否可以在网站内放置自定义日历过滤器?因为我想提取自 2000 年以来的所有数据
  • 检查此URL 它具有从开始日期 1999-12-31 到网络选项卡上提到的最后日期的数据,它具有相同的 JSON 以及您可以修改机器人以调用此 URL 的所有数据。如果您还有其他问题,请告诉我。 :)
猜你喜欢
  • 2017-02-08
  • 2018-04-09
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 2020-06-18
  • 1970-01-01
相关资源
最近更新 更多