Uso Selenium en Python para raspar. No puedo obtener valores aunque estos valores se muestran en el navegador.
Entonces revisé el código fuente HTML, luego descubrí que no hay valores en HTML como se muestra a continuación.
HTML
<div id="pos-list-body" class="list-body"> </div>Pero hay valores cuando verifiqué la herramienta de desarrollador en Chrome.
Herramientas de desarrollo
<div id="pos-list-body" class="list-body"> <div class="list-body-row" id="pos-row-1"> <div class="pos-list-col-1"> <input class="list-checkbox" type="checkbox" value="1"> </div> <div class="detail-data pos-list-col-2"> 1 </div> <div class="detail-data pos-list-col-3"> a </div> ... </div> <div class="list-body-row" id="pos-row-2"> <div class="pos-list-col-1"> <input class="list-checkbox" type="checkbox" value="2"> </div> <div class="detail-data pos-list-col-2"> 2 </div> <div class="detail-data pos-list-col-3"> b </div> ... </div> ... </div>Parece que estos valores generados por JavaScript o algo así.
No hay iframe en el código sorce.
¿Cómo puedo obtener estos valores con Python?
Agradecería si pudieras darme alguna pista.
Si ID pos-list-body es único en HTML-DOM , entonces su mejor apuesta es usar explicit wait con innerText
Código:
wait = WebDriverWait(driver, 20) print(wait.until(EC.presence_of_element_located((By.ID, "pos-list-body"))).get_attribute('innerText'))Importaciones:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC El atributo outerHTML del elemento obtiene el fragmento HTML serializado que describe el elemento, incluidos sus descendientes. También se puede configurar para reemplazar el elemento con nodos analizados de la cadena dada. Sin embargo, para obtener solo la representación HTML de los contenidos de un elemento, idealmente necesita usar la propiedad innerHTML en su lugar. Entonces, leer el valor de outerHTML devuelve un DOMString que contiene una serialización HTML del elemento y sus descendientes. Establecer el valor de outerHTML reemplaza el elemento y todos sus descendientes con un nuevo árbol DOM construido mediante el análisis del htmlString especificado.
Para obtener el html generado por JavaScript, puede usar la siguiente solución:
print(driver.execute_script("return document.getElementById('pos-list-body').outerHTML"))basado en otras respuestas que parecen no estar funcionando como una solución a su problema, queda una posibilidad que es que hay más de un elemento HTML en el DOM que tiene la ID: pos-list-body , y supongo que el primer elemento recuperado por este ID está realmente vacío y no es su elemento objetivo. Solución: intente seleccionar <div> usando Xpath en lugar de id, O obtenga todos los elementos con esta identificación en una lista e imprima el innerHTML de cada uno de ellos para obtener su índice de elementos objetivo.