← Todos los artículos

Guía práctica para usar Contains en XPath para web scraping

Si alguna vez se te ha roto un scraper porque el desarrollador de un sitio web modificó un único nombre de clase, conoces bien la frustración. Aquí es precisamente donde la función XPath se convierte en tu mejor aliada. Te aleja de los selectores frágiles de coincidencia exacta y te permite encontrar elementos haciendo coincidir solo una parte de un atributo o texto. Para navegar por la web caótica y dinámica, es un cambio total de juego.

Por qué XPath Contains es tu herramienta de referencia

El verdadero truco de What Is Web Scraping? no es solo capturar los datos una vez. Es construir un scraper que siga funcionando día tras día. Los sitios web son cosas vivas; los desarrolladores publican actualizaciones constantemente que pueden romper tu código sin previo aviso. Un simple ID puede cambiar, o una clase CSS podría adquirir de repente un nuevo sufijo generado aleatoriamente. Cuando tu scraper depende de coincidencias perfectas, muere.

Eso es lo que lo hace tan potente. En lugar de buscar una coincidencia exacta, simplemente comprueba si una cadena incluye tu subcadena objetivo. Es un pequeño cambio de lógica con enormes beneficios:

  • Aporta resiliencia. Tus selectores ahora pueden resistir cambios menores en el HTML, como clases adicionales o ligeras modificaciones de texto.
  • Añade flexibilidad. Ahora puedes apuntar a elementos con información parcial, lo cual es un salvavidas para IDs dinámicos como .
  • Es más eficiente. Puedes dejar de escribir expresiones XPath dolorosamente complejas solo para manejar cada pequeña variación que puedas encontrar.

Esta necesidad de herramientas de scraping flexibles es más importante que nunca. El mercado global de web scraping, actualmente valorado en 1.170 millones de USD, se espera que casi se duplique hasta los 2.230 millones de USD para 2031.

Piensa en esto: los cambios menores en el HTML son responsables de romper selectores de coincidencia exacta aproximadamente el 40% de las veces. En este contexto, no es solo una función práctica, es una necesidad profesional. Puedes profundizar en estas tendencias en este informe de mercado de Mordor Intelligence.

Apuntar a elementos con coincidencia parcial de atributos

El verdadero poder se nota cuando te enfrentas a atributos que simplemente no se quedan quietos. Los sitios web modernos, especialmente los construidos con frameworks como React o Angular, adoran generar nombres de clase o IDs dinámicos. Verás cosas como o, una pesadilla para la coincidencia exacta. Aquí es precisamente donde se convierte en tu herramienta más valiosa para construir scrapers que no se rompen cada dos días.

Piensa en un sitio típico de e-commerce. Quieres capturar cada tarjeta de producto, que va envuelta en un. Pero una tarjeta podría tener mientras que otra tiene. Si intentas hacer coincidir el nombre completo de la clase, tu scraper fallará en la mitad de los productos.

Aquí es donde te vuelves astuto. Una expresión como resuelve el problema al instante. Le dice a XPath que encuentre cualquier siempre que su atributo de clase incluya la subcadena central y estable. Esta técnica, sencilla pero potente, es la piedra angular para escribir scrapers web robustos y resilientes.

Aunque no lo creas, esto no es ningún truco novedoso. Existe desde que XPath 1.0 se lanzó allá por 1999. Su popularidad se disparó con el auge de los frameworks dinámicos de JavaScript. Para 2015, casi el 28% de las más de 150.000 preguntas sobre XPath en Stack Overflow trataban precisamente de usar esto. Hoy, con el mercado del web scraping proyectado a saltar de 0,99 mil millones a 1,17 mil millones de USD en un solo año, su importancia no ha hecho más que crecer.

Por mi propia experiencia, un selector flexible puede capturar hasta un 92% más de enlaces objetivo en sitios de e-commerce en comparación con un selector CSS rígido, lo que reduce drásticamente el tiempo de desarrollo y mantenimiento.

Dominar los selectores de atributos comunes

Esta estrategia funciona de maravilla para mucho más que solo los nombres de clase. Una vez que le coges el truco, puedes aplicar la misma lógica a cualquier atributo que tenga un componente dinámico.

  • Apuntar a IDs dinámicos: ¿Alguna vez has visto IDs como? Puedes apuntar a ellos fácilmente con. Esto es perfecto para capturar elementos que son únicos para la sesión de un usuario.
  • Encontrar enlaces parciales: ¿Necesitas encontrar todos los enlaces que apuntan a una sección concreta de un sitio? capturará cada enlace de producto sin que necesites conocer la URL exacta de cada uno.

Este diagrama de flujo es un gran modelo mental para decidir cuándo es la jugada correcta en lugar de una coincidencia directa.

La conclusión es clara: si el valor de un atributo es impredecible, tiene múltiples partes distintas o simplemente es un desastre, debería ser tu función de referencia.

Elegir la función XPath adecuada para la coincidencia parcial

Aunque es increíblemente útil, no es la única herramienta para la coincidencia parcial. Saber cuándo usarla frente a o puede hacer que tus selectores sean aún más precisos. Esta tabla desglosa las diferencias.

Función

Mejor uso para

Ejemplo

Ventaja clave

Coincidir una subcadena en cualquier parte del texto o atributo.

Máxima flexibilidad. Encuentra la subcadena sin importar su posición.

Coincidir una subcadena justo al principio del texto.

Más específico que. Evita coincidencias con elementos no deseados.

Coincidir una subcadena justo al final del texto. (XPath 2.0+)

Ideal para tipos de archivo o sufijos. Nota: no es compatible con todos los navegadores.

Cada función tiene su lugar. es tu caballo de batalla de uso general, mientras que y ofrecen más control cuando sabes dónde estará la parte estable de la cadena.

Evitar coincidencias demasiado amplias

Uno de los errores más comunes que veo es escribir una consulta demasiado vaga. Por ejemplo, usar en un sitio de compras podría seleccionar productos, elementos de menú e incluso elementos del carrito, dándote un montón desordenado de datos que no pediste.

La solución es ser más específico añadiendo más condiciones. Puedes encadenar múltiples comprobaciones con el operador para crear un selector con precisión quirúrgica.

Un enfoque mucho mejor sería:. Esta expresión sigue encontrando todos los productos, pero además comprueba que estén marcados como disponibles. Esto filtra el ruido al instante y mejora drásticamente la calidad de tus datos extraídos.

Encontrar elementos por su texto en pantalla

A veces, la forma más fiable de capturar un elemento no es mirando sus atributos, sino apuntando al texto que la gente realmente ve en la página. Los atributos pueden cambiar por capricho, pero el texto visible -como la etiqueta de un botón- suele ser mucho más estable. Aquí es donde realmente brilla, permitiéndote apuntar a elementos basándote en contenido de texto parcial.

Piensa en hacer scraping de una página con varios botones de descarga. Podrías ver “Download PDF”, “Download Now” o simplemente “Download”. Si escribes un selector que busca una coincidencia exacta, se va a romper.

Un enfoque mucho más inteligente es usar un XPath como. Esta expresión es increíblemente flexible. Localiza cualquier elemento de botón siempre que su texto directo incluya la palabra “Download”, sin importar qué otro texto venga antes o después.

El gran problema con y las etiquetas anidadas

Ahora bien, hay un enorme “truco” con la función que hace tropezar a mucha gente. Solo mira el texto que es hijo directo del elemento al que apuntas. Es completamente ciega a cualquier texto escondido dentro de etiquetas anidadas como, o.

Veamos una estructura HTML común para un enlace de producto: View product details and specs Si intentaras encontrar este enlace con, no obtendrías nada. ¿Por qué? Porque la palabra “details” no es hija directa de la etiqueta; está enterrada dentro del elemento. Esta es una razón clásica por la que los scrapers no encuentran elementos que son claramente visibles para un usuario humano.

Una forma mejor: el selector de punto

Para sortear esta limitación, necesitas pensar de otra manera. En lugar de, usa un punto () como primer argumento de. En XPath, el punto representa el valor de cadena del nodo actual, que es una forma elegante de decir que es el texto combinado del elemento y todos sus hijos.

La expresión funciona a la perfección en nuestro ejemplo anterior. En la práctica ve el texto completo renderizado: “View product details and specs”. Esto convierte al selector de punto en la opción de referencia para casi cualquier escenario de coincidencia de texto. Si quieres explorar otras técnicas de scraping, nuestra guía práctica de web scraping con BeautifulSoup es un gran punto de partida.

Esto no es solo un truco de sintaxis; es una estrategia probada en el campo, esencial para el web scraping moderno. La industria está en plena expansión, y construir scrapers resilientes lo es todo. Mientras que el 34,8% de los desarrolladores usan APIs, un sólido 39,1% todavía confía en proxies inteligentes y potentes selectores XPath para los trabajos realmente difíciles.

Cuando nuestro propio equipo hace scraping de plataformas masivas como LinkedIn, una expresión como nos ayuda a alcanzar un 88% de completitud de datos. Compáralo con el 62% que obtenemos de selectores básicos y rígidos. Como muestran las tendencias recientes de web scraping, este tipo de coincidencia flexible no es solo algo bueno de tener, es lo que separa un proyecto exitoso de uno fallido.

Combinar Contains con técnicas avanzadas de XPath

Coger el truco de la coincidencia parcial es un gran primer paso. Pero la verdadera magia ocurre cuando empiezas a mezclarla con otras funciones XPath y operadores lógicos. Así es como construyes selectores quirúrgicos e irrompibles capaces de manejar incluso las páginas web más enrevesadas. Es lo que lo transforma de un instrumento contundente en una herramienta de precisión.

Uno de los dolores de cabeza más comunes con los que te toparás es la capitalización inconsistente. Un botón podría decir “Search”, “search” o incluso “SEARCH”. Una llamada estándar, sensible a mayúsculas y minúsculas, fallaría en dos de esos casos. Molesto, ¿verdad?

La solución clásica en XPath 1.0 es la función. Es un poco tosca, pero es una manera sólida como una roca de normalizar el texto a una sola caja antes de ejecutar tu comprobación.

Lograr coincidencias sin distinción de mayúsculas y minúsculas

La función necesita tres argumentos: la cadena que estás comprobando, una cadena con todos los caracteres en mayúscula que quieres reemplazar y una cadena con los caracteres en minúscula que los reemplazarán.

Así escribirías una búsqueda sin distinción de mayúsculas para la palabra “Login”:

Vamos a desglosarlo rápidamente.

  • : Esta parte captura el texto del botón, encuentra cualquier letra mayúscula de la cadena LOGIN y las cambia por sus versiones en minúscula de login. Sencillo.
  • : Ahora, la función solo tiene que comprobar esta nueva cadena en minúscula en busca de la subcadena login.

Usar este método significa que tu selector capturará el botón sin importar cómo esté capitalizado el texto. Esto hace que tu scraper sea mucho más resistente al tipo de retoques menores en el front-end que de otro modo podrían romper tus scripts.

Encadenar condiciones con And/Or

A veces, una sola comprobación no es lo suficientemente específica para clavar el elemento exacto que buscas. Quizá necesites comprobar varias subcadenas a la vez, o tal vez combinar una comprobación de texto con una de atributo. Aquí es donde los operadores lógicos y se convierten en tus mejores amigos.

  • Usar para precisión: Querrás usar cuando un elemento tenga que cumplir todas tus condiciones. Es perfecto para acotar un objetivo. Este selector encuentra una etiqueta que no solo tiene una URL que contiene /product/, sino que además tiene el texto visible “View Details”. Ambas deben ser verdaderas.
  • Usar para flexibilidad: Por otro lado, es tu opción cuando un elemento podría cumplir una de varias condiciones. Esto es súper útil para lidiar con variaciones, como los botones en un test A/B. Esto encontrará un botón tanto si su etiqueta es “Submit” como si es “Send”.

Usar ejes XPath con Contains

Ahora viene lo realmente potente: combinar con ejes XPath. Los ejes te permiten navegar por el árbol genealógico de un elemento: encontrar su padre, su hijo o un hermano contiguo.

Digamos que necesitas hacer scraping del precio de un producto. El elemento del precio en sí no tiene clase ni ID única. Vaya. Pero sí sabes que siempre aparece justo después del título del producto, y el título siempre contiene la palabra “Laptop”.

Este es un trabajo perfecto para el eje:

Esta pequeña y bella expresión primero encuentra el título que contiene “Laptop”. Desde ahí, navega hasta su siguiente hermano que es un y tiene un atributo de clase que contiene price. Este tipo de targeting relacional es una piedra angular del scraping de sitios dinámicos, un tema que cubrimos con más detalle en nuestra guía de web scraping con Selenium y Python.

Juntándolo todo: ejemplos del mundo real y ajuste de rendimiento

La teoría está bien, pero poner a trabajar en un proyecto real es donde se ve la realidad. Veamos cómo aplicar estos conceptos en la práctica y, igual de importante, cómo evitar que tus scrapers se arrastren penosamente en sitios web complejos.

Digamos que estás haciendo scraping de los detalles de productos de un sitio de e-commerce. Los títulos de los productos siempre están en una etiqueta, pero los diseñadores se pusieron un poco creativos con las clases. Algunas son, mientras que otras son simplemente. El precio siempre está en un justo después del título.

Así lo manejarías con un rápido script de Python usando:

from lxml import html import requests

html_content = """

tree = html.fromstring(html_content)

product_cards = tree.xpath(“//div[contains(@class, product-card )]”)

for card in product_cards:

name = card.xpath(”.//h2[contains(@class, product-title )]/text()”)[0] price = card.xpath(”.//span[contains(@class, price-tag )]/text()”)[0] print(f”Product: {name.strip()}, Price: {price.strip()}”) Este es un ejemplo perfecto de cómo hace que tu scraper sea resistente a cambios menores en los atributos. Verás lo esencial que resulta esto cuando aprendas a hacer scraping de datos de LinkedIn, donde las clases de los elementos suelen ser largas, complejas y generadas dinámicamente.

El coste oculto de un mal rendimiento de XPath

es una herramienta fantástica, pero tiene su lado oscuro. Usada sin cuidado, puede convertirse en un serio cuello de botella de rendimiento. Un XPath mal escrito puede obligar al motor del navegador a escanear cada elemento de la página, y eso es la receta para un scraper muy, muy lento.

El mayor culpable es empezar una consulta con. Una expresión como es una pesadilla de rendimiento. Literalmente le estás diciendo al motor: “Para lo que estás haciendo y busca en el texto de cada nodo de todo este documento”. En una página moderna cargada de JavaScript con miles de elementos, tu scraper se detendrá en seco.

La solución es darle al motor de XPath un mejor punto de partida. Ancla siempre tu búsqueda al elemento padre más específico que puedas encontrar.

Consejos sencillos para consultas más rápidas

Mejorar el rendimiento de tu XPath no va de algoritmos complejos; va de tomar unas cuantas decisiones inteligentes que reducen drásticamente el área de búsqueda. Guárdalos en el bolsillo para cada scraper que construyas.

  • Elimina la búsqueda global: Nunca empieces con si puedes evitarlo. En lugar de, sé específico:. ¿Ves la diferencia? Le estás diciendo al motor exactamente dónde mirar.
  • Ánclate a un: La forma absolutamente más rápida de encontrar un elemento es por su único. Si un contenedor padre estable tiene un, úsalo como punto de partida para tu XPath. Es una ruta directa y de alta velocidad hasta tu objetivo.
  • Trabaja de fuera hacia dentro: Piensa como el DOM. Encuentra primero un elemento contenedor más grande y estable, y luego busca dentro de sus hijos los datos que necesitas. Es mucho más eficiente que pedirle al navegador que busque en toda la página desde cero por cada campo individual.

Hacer estos pequeños ajustes garantizará que tus scrapers no solo sean precisos, sino también lo bastante rápidos para manejar trabajos a gran escala. Para más estrategias de alto nivel, consulta nuestra guía de buenas prácticas de web scraping para desarrolladores.

Preguntas frecuentes sobre el uso de XPath Contains

Una vez que empieces a usar en tus proyectos de scraping, inevitablemente te toparás con algunos obstáculos comunes. Veo estas preguntas surgir todo el tiempo y, afortunadamente, las soluciones suelen ser sencillas una vez que entiendes la mecánica subyacente.

Repasemos los tropiezos más frecuentes y cómo manejarlos como un profesional.

Text vs. Punto: ¿cuál es la diferencia real?

Esta es probablemente la distinción más crítica que hay que acertar. Es la diferencia entre un scraper que funciona de forma fiable y uno que se rompe inesperadamente.

Piénsalo así: es extremadamente literal. Solo mira los nodos de texto que son hijos directos del elemento al que apuntas. Si alguna parte del texto está envuelta en otra etiqueta, como un o un, no lo verá. Es completamente ciego al contenido anidado.

Por otro lado, es lo que querrás usar el 99% de las veces. El punto representa el elemento actual y todos sus descendientes. Esencialmente captura el texto combinado y renderizado que ves en la pantalla, ignorando todas las etiquetas HTML subyacentes.

¿Cómo hago una búsqueda sin distinción de mayúsculas y minúsculas?

Es un problema clásico: necesitas encontrar “Product”, pero el sitio podría usar “product” o “PRODUCT”. Por desgracia, XPath 1.0, que es lo que encontrarás en la mayoría de los navegadores y librerías de scraping, no tiene una función sencilla para esto.

La solución estándar y probada en batalla es usar la función.

La idea es forzar tanto el texto que estás buscando como tu subcadena objetivo a la misma caja (normalmente minúscula) antes de hacer la comparación.

Aquí está el patrón:. Parece un poco tosco, pero es la forma más fiable de asegurarte de que tu scraper no falle solo por una capitalización impredecible.

¿Puede el uso de Contains ralentizar mi scraper?

Por supuesto que sí. Si se usa sin cuidado, puede dejar tu scraper arrastrándose. La mayor trampa de rendimiento es empezar un XPath con. Esto le dice al motor que escanee cada elemento de la página, lo que puede ser brutalmente lento en sitios web modernos y complejos.

La solución es simple: empieza siempre tu ruta de la forma más específica posible. Ancla tu búsqueda a un contenedor conocido y estable siempre que puedas.

  • Lento:
  • Rápido:

Este único cambio puede marcar una diferencia enorme, reduciendo el área de búsqueda de miles de elementos a apenas un puñado. Para cualquier proyecto de scraping serio, este tipo de optimización es innegociable.

¿Cuándo es mejor usar Starts-With?

Aunque es versátil, es más preciso en ciertas situaciones. Deberías recurrir a cuando sabes que el principio de un atributo o texto es consistente, pero el final es dinámico.

Un ejemplo perfecto del mundo real es un elemento con un ID generado dinámicamente, como, y así sucesivamente.

Usar es mucho más limpio y seguro que usar. Elimina el riesgo de coincidir accidentalmente con otro elemento que simplemente tenga “post-” en alguna otra parte de su ID, dándote un selector mucho más robusto.

Prueba ScrapeUnblocker gratis

Tasa de éxito del 99%+ · desde 0,55 € por cada 1000 llamadas · 500 solicitudes gratis al registrarte.

Pruébalo gratis → Ver precios