用beautifulsoup拉当前股价(Yahoo)

时间:2019-03-08 03:32:11

标签: python python-3.x web-scraping beautifulsoup stock

我在使用漂亮的汤(python3)来获取最新股价时遇到问题

enter image description here

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"})

这将带回“无”值。有什么我想念的吗?使用不同的页面,以下工作正常:

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值的最佳方法是什么?

5 个答案:

答案 0 :(得分:3)

价格在那里,可以按类别选择(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)

答案 1 :(得分:1)

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())

这将返回141.28

答案 2 :(得分:0)

因此可以解决,但是由于这只是一个有趣的项目,因此以下工作可以找到正确的答案(尽管我希望有一个适当的,可扩展的解决方案)

for (let i = 0; i < 3; i++) {
	if($('#specsContainer > div.specs__title > h4', html).eq(i).text() == "Fruits"){
		console.log($('#specsContainer > div.specs__table', html).eq(i).html());
	};
	if($('#specsContainer > div.specs__title > h4', html).eq(i).text() == "Vegetables"){
		console.log($('#specsContainer > div.specs__table', html).eq(i).html());
	};
};

答案 3 :(得分:0)

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,即可找到所需的数据

答案 4 :(得分:0)

这是一个适用于我的解决方案,但是如果网站元素已更新,class_中的元素可能会更改,因此如果出现以下情况,我将复制并粘贴网站检查中的最新元素:解决方案失败。

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())