J'essaie d'extraire des données de prix en temps réel des actions de Yahoo Finance. Ces informations sont contenues dans une balise «span» avec une «classe» et un «data-reactid». Je ne parviens pas à extraire les informations de cette balise span.
Lorsque j'entre mon code, je n'obtiens aucune sortie et je n'obtiens aucune erreur.
J'ai essayé presque toutes les autres réponses à cette question, mais aucune n'a fonctionné pour moi.
#Python Script my_url = "https://finance.yahoo.com/quote/AAPL?p=AAPL&.tsrc=fin-srch" u_client = u_req(my_url) page_html = u_client.read() u_client.close() page_soup = soup(page_html, "html.parser") container = page_soup.find('span', {"data-reactid":'34'})
<--HTML Code--> <span class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)" data-reactid="34">197.00</span>
Je voudrais obtenir la sortie de "197.00" (prix en temps réel du stock) comme sortie.
4 Réponses :
D'une manière ou d'une autre, le data-reactid est changé en 14 lors de la lecture de l'url.
page_soup = soup(page_html, "html.parser") container = page_soup.find('span', {"data-reactid":'14'}) if container: print(container.text)
Étant donné que data-reactid peut changer, j'utiliserais une classe unique pour sélectionner. La sélection par classe est également plus rapide.
import requests from bs4 import BeautifulSoup as bs r = requests.get('https://finance.yahoo.com/quote/AAPL/') soup = bs(r.content, 'lxml') print(soup.select_one('.Mb\(-4px\)').text)
J'ai ouvert l'URL dans Chrome et appuyé sur F12. Un clic sur l’onglet Réseau a révélé cette requête à partir de la page: https://query1.finance.yahoo.com/v8/finance/chart/AAPL?region=US&lang=en-US&includePrePost=false&interval=2m&range= 1d & corsDomain = finance.yahoo.com & .tsrc = finance
Je suggère d'explorer les appels AJAX sous-jacents qui semblent présenter un résultat JSON bien formaté et de regarder l'URL avec un certain nombre de paramètres que vous pouvez modifier.
Vous pouvez le récupérer de différentes manières. Voici l'un d'entre eux:
price = soup.select_one("[class*='smartphone_Mt'] span").text print(price)
Une autre façon:
import requests from bs4 import BeautifulSoup res = requests.get('https://finance.yahoo.com/quote/AAPL') soup = BeautifulSoup(res.text, 'lxml') price = soup.select_one('#quote-market-notice').find_all_previous()[2].text print(price)
Qu'est-ce que
u_req
?@gmds Je pense à partir de ce
de urllib.request import urlopen comme u_req
@Kush G. Je pense que c'est parce que la sortie est rendue avec JavaScript. Vous avez donc besoin de
sélénium
au lieu deBeautifulSoup