用 beautifulsoup 拉动当前股价 (Yahoo)

Pulling current stock price (Yahoo) with beautifulsoup

我在使用美汤(python3)拉取最新股价时遇到问题

import requests
from money import Money
from bs4 import BeautifulSoup 

response = requests.get("https://finance.yahoo.com/quote/VTI?p=VTI")
soup = BeautifulSoup(response.content, "lxml")
price = soup.find('span', attrs = {"data-reactid": "34"})

这会返回 "None" 的值。有什么我想念的吗?使用不同的页面,以下工作正常:

response = requests.get("https://finance.yahoo.com/lookup?s=VTI")
soup = BeautifulSoup(response.content,"lxml")
price = soup.find('td', attrs={"data-reactid": "59"})

不幸的是,该搜索页面并不总是与第一个结果完全匹配(搜索 VXUS 会返回 vxus 作为第二个结果)所以我希望找到始终如一的东西,我想拉来自实际页面的效果最好。

拉动 141.28 值的最佳方法是什么?

所以这是一个变通办法,但由于这只是一个有趣的项目,以下工作可以获得正确的答案(尽管我更喜欢适当的、可扩展的解决方案)

response = requests.get("https://finance.yahoo.com/lookup/etf?s=vxus")
soup = BeautifulSoup(response.content,"lxml")
price = soup.select('table td')
print(price[2].text)
import requests
from bs4 import BeautifulSoup
import json

response = requests.get("https://finance.yahoo.com/quote/VTI?p=VTI")
soup = BeautifulSoup(response.content)
price = soup.findAll('script')
regularMarketPrice

a = price[-3].contents[0]

jjj = json.loads(a[111:-12])

jjj['context']['dispatcher']['stores']['StreamDataStore']['quoteData']['VTI']['regularMarketPrice']

这可能对你有帮助,先获取脚本数据,然后将其转化为json,你可以找到你想要的数据

价格在那里,可以通过 class 选择(仅次于 id 的第二快选择器方法)

import requests
from bs4 import BeautifulSoup as bs

res = requests.get('https://finance.yahoo.com/quote/VXUS?p=VXUS')   # https://finance.yahoo.com/quote/VTI?p=VTI
soup = bs(res.content, 'lxml')
price = soup.select_one('.Trsdu\(0\.3s\)').text
print(price)
import requests
from bs4 import BeautifulSoup 


response = requests.get("https://finance.yahoo.com/quote/VTI?p=VTI")
soup = BeautifulSoup(response.content, "lxml")

for stock in  soup.find_all('span', class_='Trsdu(0.3s) Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(b)'):
    print(stock.get_text())

这将 return 141.28

这是一个适合我的解决方案,但是如果网站元素更新,class_ 中的元素可能会发生变化,所以我会从网站中复制并粘贴最多的 up-to-date 元素检查解决方案是否失败。

import requests
from bs4 import BeautifulSoup as bs

res = requests.get('https://finance.yahoo.com/quote/SQQQ/')   
soup = bs(res.content, 'lxml')
for stock in soup.find_all('span', class_='Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)'):
    print(stock.get_text())