Вытащить текущую цену акций (Yahoo) с BeautifulSoup - PullRequest
1 голос
/ 08 марта 2019

У меня проблемы с использованием красивого супа (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 как 2-й результат), поэтомуЯ надеюсь найти что-то, что работает последовательно, и я полагал, что извлечение из реальной страницы будет работать лучше всего.

Как лучше всего получить значение 141,28?

Ответы [ 4 ]

3 голосов
/ 08 марта 2019

Цена есть и выбирается по классу (второй самый быстрый метод выбора после идентификатора)

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 голос
/ 08 марта 2019
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

0 голосов
/ 08 марта 2019
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, вы можете найти нужные данные

0 голосов
/ 08 марта 2019

так что это обходной путь, но, так как это просто проект для развлечения, следующее работает, чтобы получить правильный ответ (хотя я бы предпочел правильное, расширяемое решение)

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