使用BeautifulSoup在Yahoo Finance中搜索

5

我正在尝试从Yahoo的“关键统计”页面中获取股票代码的信息(因为Pandas库不支持此功能)。

AAPL的示例:

from bs4 import BeautifulSoup
import requests

url = 'http://finance.yahoo.com/quote/AAPL/key-statistics?p=AAPL'
page = requests.get(url)
soup = BeautifulSoup(page.text, 'lxml')

enterpriseValue = soup.findAll('$ENTERPRISE_VALUE', attrs={'class': 'yfnc_tablehead1'}) #HTML tag for where enterprise value is located

print(enterpriseValue)

编辑:谢谢Andy!

问题:这将打印一个空数组。如何更改我的findAll以返回598.56B

1个回答

12

原因是find_all返回的列表为空,是因为该数据由一个单独的调用生成,仅通过向该URL发送GET请求无法完成。如果您在Chrome/Firefox中查看网络选项卡,并按XHR筛选器过滤,通过检查每个网络操作的请求和响应,可以找到您应该发送GET请求的URL。

在这种情况下,它是https://query2.finance.yahoo.com/v10/finance/quoteSummary/AAPL?formatted=true&crumb=8ldhetOu7RJ&lang=en-US&region=US&modules=defaultKeyStatistics%2CfinancialData%2CcalendarEvents&corsDomain=finance.yahoo.com,如下所示:enter image description here

那么,我们该如何重新创建呢?简单!:

from bs4 import BeautifulSoup
import requests

r = requests.get('https://query2.finance.yahoo.com/v10/finance/quoteSummary/AAPL?formatted=true&crumb=8ldhetOu7RJ&lang=en-US&region=US&modules=defaultKeyStatistics%2CfinancialData%2CcalendarEvents&corsDomain=finance.yahoo.com')
data = r.json()

这将返回一个dict形式的JSON响应。从那里,通过dict浏览,直到找到您需要的数据:

financial_data = data['quoteSummary']['result'][0]['defaultKeyStatistics']
enterprise_value_dict = financial_data['enterpriseValue']
print(enterprise_value_dict)
>>> {'fmt': '598.56B', 'raw': 598563094528, 'longFmt': '598,563,094,528'}
print(enterprise_value_dict['fmt'])
>>> '598.56B'

1
这真是太棒了!我对网页抓取还不太熟悉。你能给我指点一些资源,以免将来遇到类似的问题吗? - Rafael
2
请查看 https://automatetheboringstuff.com/chapter11/ ,如果你真的想深入学习,请考虑 http://shop.oreilly.com/product/0636920034391.do 。这是一项非常有用的技能。 - n1c9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接