Actualización: el script proporcionado por Jonas ha resuelto la mayoría de los problemas. Ahora, estoy tratando de encontrar una manera de usar datepicker o sendkey para establecer el rango de fechas, ya que tomará automáticamente un día cada vez que vuelva a ejecutar el código.
date_start = driver.find_element(By.Xpath, 'date_from') date_end = driver.find_element(By.Xpath, 'date_to') date_start.sendKeys("2021-09-24") date_end.sendKeys("2021-10-01")Problema original: estoy usando Selenium WebDriver.Chrome para extraer datos de una tabla que no se puede resaltar para copiar y pegar desde el sitio web y descubrí que los datos están bajo la función de JavaScript cuando traté de extraer los datos con BeautifulSoup. El código HTML para la tabla de Java es así:
<script> function initTableData() { window.initialAnalystData = [{"action_company":"Initiates Coverage On","action_pt":"Announces","analyst":"BTIG","analyst_name":"James Sullivan","currency":"USD","lastTradePrice":24.89},"logo":null}]; window.initialAnalystDate = {"date_from":"2021-09-24","date_to":"2021-10-01"}; window.initialAnalystTime = "11:27"; } initTableData(); </script>Soy nuevo en Selenium y JavaScript, pero probé el siguiente código para obtener la lista de datos y no funciona.
element = driver.findElement(By.tagName("script")); htmlCode = driver.executeScript("return arguments[0].innerHTML;", element)¿Qué debo probar a continuación? El enlace del sitio web está aquí .
¡Gracias!
Podría usar una expresión regular para encontrar la parte y luego trabajar con ella:
from selenium import webdriver import time import re url = 'https://www.benzinga.com/analyst-ratings' driver.get(url) time.sleep(5) #Let it load all the data first htmlSource = driver.page_source raw_data = re.findall(r'window.initialAnalystData = .*;', htmlSource)[0][29:].split('{')[1:] #clean data if you want (just one possible way out of many!): cleaned_data = {} for data in raw_data: clean_data = data.split(',') details_to_dic = {} for details in clean_data: details_temp = details.replace('"', '') details_temp = details_temp.split(':') try: details_to_dic[details_temp[0]] = details_temp[1] except: pass cleaned_data[details_to_dic['name']] = details_to_dicEntonces tienes los datos como un diccionario (datos de ejemplo de la empresa APA):
print(cleaned_data['APA'])producción:
{'action_company': 'Downgrades', 'action_pt': 'Lowers', 'analyst': 'Citigroup', 'analyst_name': 'Scott Gruber', 'currency': 'USD', 'date': '2021-10-01', 'exchange': 'NASDAQ', 'id': '61573ba273a5f300019bb64a', 'importance': '0', 'name': 'APA', 'notes': '', 'pt_current': '23.0000', 'pt_prior': '27.0000', 'rating_current': 'Neutral', 'rating_prior': 'Buy', 'ticker': 'APA', 'time': '12', 'updated': '1633106928', 'url': 'https', 'url_calendar': 'https', 'url_news': 'https', 'quote': ''}