es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo raspar una tabla dinámica usando Selenium y Python.

Actualmente estoy intentando hacer scrapping de un sitio web para obtener información y cada vez que intento localizar elementos a través de su XPath o selector css, el código devuelve que no puede encontrar dichos elementos. Esta página requiere que se ingrese un valor en una casilla para generar la tabla. Aquí está mi código hasta ahora:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup as bs
import pandas as pd
import requests

path_driver = "C:/Users/CS330584/Documents/Documentos de Defesa da Concorrência/Automatização de Processos/chromedriver.exe"
website = "https://www.sefaz.rs.gov.br/DAT/DEV-JUR-CON.aspx"
value_search = "999"

driver = webdriver.Chrome(path_driver)
driver.get(website)

search_max = driver.find_element_by_name("txtMaiores")
search_max.send_keys(value_search)

btn_consult = driver.find_element_by_class_name("botaoMed")
btn_consult.click()

table = driver.find_element_by_xpath('//*[@id="conteudoResult"]/table')

¿Alguna idea de por qué está sucediendo esto y cómo resolver este problema?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Es posible que los elementos que estás intentando localizar aún no existan cuando trates de encontrarlos. Esto se debe a que estás ingresando un valor en una caja y generando la tabla, por lo que debes esperar a que la página termine de cargarse antes de poder encontrar los elementos.

    Para solucionar este problema, puedes usar la función WebDriverWait del módulo selenium.webdriver.support.ui para esperar a que los elementos se vuelvan visibles o clicables:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    search_max = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.NAME, "txtMaiores")))
    btn_consult = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "botaoMed")))
    table = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="conteudoResult"]/table')))
    

    Este código esperará un máximo de 10 segundos para que cada elemento se vuelva visible o cliclable antes de continuar con la ejecución del script. Si el elemento no se encuentra dentro de este plazo de tiempo, el script lanzará una TimeoutException.

Comments are closed.