Estoy tratando de obtener información de la página ‘Estadísticas clave’ para un ticker en Yahoo (ya que esto no es compatible con la biblioteca de Pandas).
Ejemplo para AAPL:
from bs4 import BeautifulSoup import requests url = 'http://finance.yahoo.com/quote/AAPL/key-statistics?p=AAPL' page = requests.get(url) soup = BeautifulSoup(page.text, 'lxml') enterpriseValue = soup.findAll('$ENTERPRISE_VALUE', attrs={'class': 'yfnc_tablehead1'}) #HTML tag for where enterprise value is located print(enterpriseValue)
Edit: gracias Andy!
Pregunta: Esto es imprimir una matriz vacía. ¿Cómo cambio mi findAll
para devolver 598.56B
?
Bueno, la razón por la que la lista que encuentra find_all
está vacía es porque los datos se generan con una llamada separada que no se completa simplemente enviando una solicitud GET
a esa URL. Si mira a través de la pestaña Red en Chrome / Firefox y filtra por XHR, al examinar las solicitudes y respuestas de cada acción de la red, puede encontrar la URL que debe enviar también a la solicitud GET
.
En este caso, se trata de https://query2.finance.yahoo.com/v10/finance/quoteSummary/AAPL?formatted=true&crumb=8ldhetOu7RJ&lang=en-US®ion=US&modules=defaultKeyStatistics%2CfinancialData%2CcalendarEvents&corsDomain=finance.yahoo.com
de personas Podemos ver aquí:
Entonces, ¿cómo recreamos esto? ¡Sencillo! :
from bs4 import BeautifulSoup import requests r = requests.get('https://query2.finance.yahoo.com/v10/finance/quoteSummary/AAPL?formatted=true&crumb=8ldhetOu7RJ&lang=en-US®ion=US&modules=defaultKeyStatistics%2CfinancialData%2CcalendarEvents&corsDomain=finance.yahoo.com') data = r.json()
Esto devolverá la respuesta JSON
como un dict
. Desde allí, navegue por el dict
hasta que encuentre los datos que está buscando:
financial_data = data['quoteSummary']['result'][0]['defaultKeyStatistics'] enterprise_value_dict = financial_data['enterpriseValue'] print(enterprise_value_dict) >>> {'fmt': '598.56B', 'raw': 598563094528, 'longFmt': '598,563,094,528'} print(enterprise_value_dict['fmt']) >>> '598.56B'