3
votes

Comment pouvez-vous webscrape les données d'une balise "span" avec un "data-reactid" en utilisant beautifulsoup en python?

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.


3 commentaires

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 de BeautifulSoup


4 Réponses :


1
votes

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)


0 commentaires

0
votes

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


0 commentaires

0
votes

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.


0 commentaires

2
votes

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)


0 commentaires