Aprende por qué Selenium podría no encontrar elementos utilizando nombres de clase y XPaths complejos, y cómo usar efectivamente selectores CSS con WebDriverWait para extraer datos de páginas web dinámicas.
---
Visita estos enlaces para contenido original y más detalles, como soluciones alternativas, últimas actualizaciones/desarrollos sobre el tema, comentarios, historial de revisiones, etc. Por ejemplo, el título original de la pregunta fue: ¿Por qué Selenium no encuentra elementos?
Si algo te parece extraño, no dudes en dejarme un comentario debajo de este video.
---
Descripción del Problema
Al hacer web scraping en sitios web con Selenium, un problema común es no obtener resultados al intentar encontrar elementos. Esto a menudo sucede porque:
Los elementos objetivo no coinciden con los selectores especificados (nombres de clase o XPath).
Los elementos aún no están cargados cuando se ejecuta la búsqueda.
XPaths complejos o frágiles pueden romperse fácilmente con cambios en la estructura del sitio.
Por qué tu código podría no devolver salida
En el ejemplo, los elementos se localizaron utilizando:
[[Ver video para revelar este texto o fragmento de código]]
Esto es problemático porque By.CLASS_NAME acepta solo un nombre de clase, no múltiples. Usar dos nombres de clase juntos provoca que falle.
Además, usar un XPath absoluto dentro de cada elemento de casa es frágil y probablemente se rompa si cambia el diseño de la página.
Un enfoque mejor y más confiable
Usa selectores CSS en lugar de nombres de clase o XPaths complejos
Los selectores CSS permiten apuntar a elementos por combinación de atributos y jerarquía de manera clara y concisa.
Espera a que aparezcan los elementos
Las páginas web a menudo cargan datos dinámicamente. Usa WebDriverWait y expected_conditions para esperar hasta que los elementos estén presentes antes de extraer datos.
Código de ejemplo
[[Ver video para revelar este texto o fragmento de código]]
Por qué esto funciona mejor
Selector CSS: Apunta a cada listado de casa (div[data-testid=result-item]) y su título <h2> directamente.
WebDriverWait: Asegura que Selenium espere hasta que los elementos aparezcan en la página.
Extracción de texto robusta: etext() maneja casos donde .text podría estar vacío pero textContent contiene los datos.
Resumen
Para evitar que Selenium no encuentre elementos:
Evita combinar múltiples clases en By.CLASS_NAME; en su lugar, usa By.CSS_SELECTOR.
Prefiere selectores CSS o XPath relativo sobre XPath absoluto.
Usa esperas explícitas (WebDriverWait) para manejar contenido dinámico de la página.
Este enfoque conduce a scripts de web scraping más confiables y mantenibles.