CursosEmpresasBlogLiveConfPrecios

Predicados en Xpath

Clase 10 de 21 • Curso de Fundamentos de Web Scraping con Python y Xpath

Clase anteriorSiguiente clase

Contenido del curso

Introducción al web scraping
  • 1
    ¿Qué es el web scraping?

    ¿Qué es el web scraping?

    02:06
  • 2
    ¿Por qué aprender web scraping hoy?

    ¿Por qué aprender web scraping hoy?

    03:05
  • 3
    Python: el lenguaje más poderoso para extraer datos

    Python: el lenguaje más poderoso para extraer datos

    03:21
Fundamentos de la web
  • 4
    Entender HTTP

    Entender HTTP

    07:02
  • 5
    ¿Qué es HTML?

    ¿Qué es HTML?

    08:08
  • 6
    Robots.txt: permisos y consideraciones al hacer web scraping

    Robots.txt: permisos y consideraciones al hacer web scraping

    05:41
XML Path Language
  • 7
    XML Path Language

    XML Path Language

    03:35
  • 8
    Tipos de nodos en XPath

    Tipos de nodos en XPath

    05:18
  • 9
    Expresiones en XPath

    Expresiones en XPath

    08:18
  • 10
    Predicados en Xpath

    Predicados en Xpath

    05:34
  • 11
    Operadores en Xpath

    Operadores en Xpath

    05:51
  • 12
    Wildcards en Xpath

    Wildcards en Xpath

    06:11
  • 13
    In-text search en Xpath

    In-text search en Xpath

    08:21
  • 14
    XPath Axes

    XPath Axes

    05:16
  • 15

    Resumen de XPath

    00:01
  • 16
    Aplicando lo aprendido

    Aplicando lo aprendido

    08:52
Proyecto: scraper de noticias
  • 17
    Un proyecto para tu portafolio: scraper de noticias

    Un proyecto para tu portafolio: scraper de noticias

    10:08
  • 18
    Construcción de las expresiones de XPath

    Construcción de las expresiones de XPath

    10:29
  • 19
    Obteniendo los links de los artículos con Python

    Obteniendo los links de los artículos con Python

    10:56
  • 20
    Guardando las noticias en archivos de texto

    Guardando las noticias en archivos de texto

    14:53
Conclusiones
  • 21
    Cómo continuar tu ruta de aprendizaje

    Cómo continuar tu ruta de aprendizaje

    02:13
    Alan Vazquez

    Alan Vazquez

    student•
    hace 5 años

    Comparacion de XPATH con CSS Selectors

    XPATHCSS SelectorDescripcion
    elemento[n]:nth-child(n)Numero de elemento
    :nth-last-child(n)Elementos empezando desde el ultimo
    elemento[last()]:last-childUltimo elemento
    elemento[@attr=value][attr=value]Atributo con un valor especifico
    .nombre-claseClase
    #nombre-idID
    # El primer elemento $$('body>div>div:nth-child(1)') # El penultimo elemento $$('body>div>div:nth-last-child(2)') # Ultimo elemento $$('body>div>div:last-child') # Span con la clase text $$('span.text') # Cualquier elemento con la clase text $$('.text') # Cualquier elemento con el atributo itemprop $$('[itemprop]') #Spans con el atributo itemprop $$('span[itemprop]')

    Una de las ventajas de usar CSS es que no es necesario que especifiques el elemento, simplemente puedes buscar los atributos, el ultimo elemento, etc. Bueno o al menos yo no se hacerlo en XPATH

      Francisco Garcia [C6]

      Francisco Garcia [C6]

      student•
      hace 5 años

      Gracias compañero

      karen gonzalez

      karen gonzalez

      student•
      hace 5 años

      gracias! que util

    Alejandro Giraldo Londoño

    Alejandro Giraldo Londoño

    student•
    hace 5 años

    RESUMEN: Predicados Xpath

    ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

    • [predicado] :Para encontrar nuestra información debemos ser más especificos, para ello sirve los predicados.

    Predicados :

    • n : Hace referencia al n elemento de la lista.
    • last(): Al último elemento de la lista.
    • @atribute_name : Al usarse como predicado me trae todos los nodos que contienen este atributo
    • @atribute_name="" : Al usarse como predicado me trae todos los nodos que contienen este atributo, incluso el value de este atributo.

    Ejemplos:

    # Para extraer solo uno de los div del div container usamos un predicado $x('/html/body/div/div[1]') # Devuelve [div.row.header-box] $x('//span[@class="text"]/text()').map(x=>x.wholeText) # Devuelve (10) ["“The world as we have created it is a process of o…cannot be changed without changing our thinking.”", "“It is our choices, Harry, that show what we truly are, far more than our abilities.”", "“There are only two ways to live your life. One is… The other is as though everything is a miracle.”", "“The person, be it gentleman or lady, who has not …ure in a good novel, must be intolerably stupid.”", "“Imperfection is beauty, madness is genius and it'…be absolutely ridiculous than absolutely boring.”", "“Try not to become a man of success. Rather become a man of value.”", "“It is better to be hated for what you are than to be loved for what you are not.”", "“I have not failed. I've just found 10,000 ways that won't work.”", "“A woman is like a tea bag; you never know how strong it is until it's in hot water.”", "“A day without sunshine is like, you know, night.”"]
      David Amador Morales

      David Amador Morales

      student•
      hace 5 años

      Alejandro, se aprecian mucho tus resúmenes, gracias.

      Moisés Manuel Morín Hevia

      Moisés Manuel Morín Hevia

      student•
      hace 5 años

      Buen resumen.

    Juan David Sánchez

    Juan David Sánchez

    student•
    hace 5 años

    He hecho un resumen de los predicados disponibles en XPath que aprendimos en esta clase.

    XPath Predicates
      Moisés Manuel Morín Hevia

      Moisés Manuel Morín Hevia

      student•
      hace 5 años

      Buena forma visual.

      Jesús Zelaya Contreras

      Jesús Zelaya Contreras

      student•
      hace 4 años

      Muy bueno !

    Bryan Javier Calero Robleto

    Bryan Javier Calero Robleto

    student•
    hace 5 años

    Cuando necesitamos un numero especifico dentro ese numero de nodos podemos utilizar [ ] como si fuera una lista, entonce llamamos el numero en el que esta ordenado esa etiqueta

    $x('/hrml/body/div/div[1]') nos devolveria el div [1] dentro de la anterior busuqueda

    $x('/hrml/body/div/div[last()]') podemos pedir el ultimo con las sentencia last

    $x('//span[@class]') aqui solicitamos todos lo espam que tengan al menos un elemento de tipo class

    $x('//span[@class="text"]') pedimos una clase determinada, en este ejemplo solo pedimos la clase text

    Bryan Duarte

    Bryan Duarte

    student•
    hace 5 años

    Siendo estrictos, si usáramos [1] no nos tendría que devolver el primer div, nos tendría que devolver el segundo, por qué un ingeniero comienza a contar desde el 0. (tus cursos no fueron en vano profe Aroesti) . nah, es broma :grimacing:

      Moisés Manuel Morín Hevia

      Moisés Manuel Morín Hevia

      student•
      hace 5 años

      xD todo comienza en cero.

      Diego Jurado

      Diego Jurado

      student•
      hace 3 años

      También estaba pensando en eso... si empieza en 0 o en 1

    Luis Fernando Úbeda Camacho

    Luis Fernando Úbeda Camacho

    student•
    hace 5 años

    Los predicados siempre van entre corchetes [ ]

      Moisés Manuel Morín Hevia

      Moisés Manuel Morín Hevia

      student•
      hace 5 años

      & sirven para filtrar mejor las expresiones.

    César Ernesto Rivas Martínez

    César Ernesto Rivas Martínez

    student•
    hace 5 años
    $x('//span[@class="text"]/text()').map(x => x.wholeText)
    Luis Rogelio Reyes Hernandez

    Luis Rogelio Reyes Hernandez

    student•
    hace 5 años
    // [] se usa para predicados $x('/html/body/div/div[1]') // en este caso se pide que solo traiga el primer elemento $x('/html/body/div/div[last()]') // se pide el ultimo elemento de la lista $x('//span[@class]') // solo los span que tenga una clase $x('//span[@class="text"]') // solo los span que tenga la clase "text" $x('//span[@class="text"]/text()').map(x => x.wholeText) // extrajendo todas la citas del sitio web
    Oscar Jachilla Infantes

    Oscar Jachilla Infantes

    student•
    hace 5 años

    Solo para aclarar, también ahora si funciona en navegador Microsoft Edge, así como en Chrome.

      Eduardo Vera Sánchez

      Eduardo Vera Sánchez

      student•
      hace 5 años

      Así es compañero, de hecho funcionará en cualquier navegador basado en Chromium.

      Moisés Manuel Morín Hevia

      Moisés Manuel Morín Hevia

      student•
      hace 5 años

      Nadie usa Edge xD xD

    Andrés Molina

    Andrés Molina

    student•
    hace 5 años

    Todo esto funciona muy similar a la indentacion en python y al manejo de listas, no es igual pero si muy similar

    Juan Ochoa

    Juan Ochoa

    student•
    hace 5 años

    Dejó más teoría de XPath https://www.mclibre.org/consultar/xml/lecciones/xml-xpath.html

      Moisés Manuel Morín Hevia

      Moisés Manuel Morín Hevia

      student•
      hace 5 años

      Se agradece.

      Rubén Gustavo García Málaga

      Rubén Gustavo García Málaga

      student•
      hace 3 años

      excelente aporte

    Cristhian Sanchez Medina

    Cristhian Sanchez Medina

    student•
    hace 4 años

    Soy el único que hizo web spaping con los comentarios de la clase? 😈 $x('//p[@class="Content-author-name"]/text()').map(x => x.wholeText)

      Ricardo

      Ricardo

      student•
      hace 4 años

      ya no funciona

    JUAN SEBASTIAN ZAPATA AVENDAÑO

    JUAN SEBASTIAN ZAPATA AVENDAÑO

    student•
    hace 5 años

    Muy interesante

      Moisés Manuel Morín Hevia

      Moisés Manuel Morín Hevia

      student•
      hace 5 años

      Super interesante.

    Eduardo Héctor Taipe Límaco

    Eduardo Héctor Taipe Límaco

    student•
    hace 5 años

    Digamos que sean varios span con la misma clase intenté hacer: $x('//span[@class="text"][1]') $x('//span[@class="text"][position ()=1]') Pero no funcionó. Alguna forma de obtenerlo.

      Alan Kevin Fuentes García

      Alan Kevin Fuentes García

      student•
      hace 5 años

      Hola! Basta con encerrar toda la expresión entre paréntesis antes de usar los corchetes:

      $x('(//span[@class="text"])[1]');
    Juan Fernando Moyano Ramírez

    Juan Fernando Moyano Ramírez

    student•
    hace 5 años

    Hola a todos, os dejo mis apuntes de esta clase, sin embargo, he creado un respositorio en github donde estan todos los apuntes de este curso: https://github.com/fer2002743/web-scraping

    <h2>Predicados en Xpath</h2>

    Con lo aprendido en la clase anterior no es suficiente para poder filtrar todo lo que queremos de las paginas web, para ello necesitamos los predicados.

    Supongamos que tengo la siguiente expresion:

    $x('/html/body/div/div')

    Sin embargo supongamos que yo no quiero a los dos nodos div, yo solo quiero el primero, para ello uso el predicado [1], que se pone al final del ultimo nodo.

    $x('/html/body/div/div[1]')

    Pero ahora supongamos que yo quiero el ultimos predicado, para ello en vez de usar [1], uso el predicado [last].

    $x('/html/body/div/div[last()]')

    Ahora supongamos que quiero traer todos los elementos que hay en el nodo span, pero quiero poner una condicion, y dicha condicion es que al menos contengan el atributo class, para ello escribo

    $x('//span[@class]')

    Pero ahora me voy a volver mas exquisito, y es que ahora ademas de que los elementos tengan la clase class, quiero que esa clase sea un texto, en este caso tengo que escribir:

    $x('//span[@class="text"]')
    Carlos Andres Ocampo Pabon

    Carlos Andres Ocampo Pabon

    student•
    hace 5 años

    Pero entonces en sí ¿qué es un predicado? un predicado es una expresión xpath, pero no todas las expresiones xpath son predicados?

      Moisés Manuel Morín Hevia

      Moisés Manuel Morín Hevia

      student•
      hace 5 años

      Sirve para Filtrar de forma especifica, son condiciones de filtrado. Modifican las expresiones.

    Carolina Acosta Muñoz

    Carolina Acosta Muñoz

    student•
    hace 5 años

    Esquema elaborado por Facundo

      Moisés Manuel Morín Hevia

      Moisés Manuel Morín Hevia

      student•
      hace 5 años

      No se ve la imagen.

    Francisco Garcia [C6]

    Francisco Garcia [C6]

    student•
    hace 5 años

    listo

      Moisés Manuel Morín Hevia

      Moisés Manuel Morín Hevia

      student•
      hace 5 años

      Soy yo.

    Carlos Javier Guevara Contreras

    Carlos Javier Guevara Contreras

    student•
    hace 5 años

    Los predicados de XPath encuentran un nodo o secuencia de nodos coincidentes en un documento jerárquico. Una expresión de predicado define el valor de un campo Entrada, Condición o Salida de una instrucción de asignación. La expresión de XPath determina el contexto en el que una instrucción de asignación se ejecuta. Utilice las siguientes expresiones de XPath en predicados para seleccionar un nodo o secuencia de nodos: ancestor Selecciona todos los antecesores, como los elementos principales y superiores, del nodo actual. Por ejemplo, la expresión de predicado "antecesor::book" selecciona todos los antecesores de libro del nodo actual. ancestor-or-self Selecciona todos los antecesores, como los elementos principales y superiores, del nodo actual, además del propio nodo actual. Por ejemplo, la expresión de predicado "ancestor-or-self::book" selecciona todos los antecesores de libro del nodo actual y también el nodo actual. attribute Selecciona todos los atributos del nodo actual. Por ejemplo, la expresión de predicado "antecesor::lang" selecciona el atributo lang del nodo actual. child Selecciona todos los elementos secundarios del nodo actual. Por ejemplo, la expresión de predicado "child::book" selecciona todos los nodos de libros que son secundarios respecto al nodo actual. descendant Selecciona todos los descendientes, tales como elementos secundarios o de segundo nivel, del nodo actual. Por ejemplo, la expresión de predicado "descendant::book" selecciona todos los descendientes de libro del nodo actual. descendant-or-self Selecciona todos los descendientes, como los elementos secundarios y de segundo nivel, del nodo actual, además del propio nodo actual. Por ejemplo, la expresión de predicado "descendant-or-self::book" selecciona todos los descendientes de libro del nodo actual y también el nodo actual si se trata de un nodo de libro. following Selecciona todos los elementos del documento después de la etiqueta de cierre del nodo actual. Por ejemplo, la expresión de predicado "following::book" selecciona todos los elementos del documento después de la etiqueta de cierre del nodo de libro. following-sibling Selecciona todos los elementos del mismo nivel que aparecen después del nodo actual. Por ejemplo, la expresión de predicado "following-sibling::book" selecciona todos los elementos del mismo nivel del documento después del nodo de libro. namespace Selecciona todos los nodos de espacio de nombres del nodo actual. parent Selecciona el elemento principal del nodo actual. Por ejemplo, la expresión de predicado "parent::book" selecciona el atributo lang del nodo actual. preceding Selecciona todos los nodos que aparecen antes del nodo actual en el documento, excepto los antecesores, los nodos de atributo y los nodos de espacio de nombres. Por ejemplo, la expresión de predicado "preceding::book" selecciona los nodos anteriores al nodo de libro. preceding-sibling Selecciona todos los elementos del mismo nivel que aparecen antes del nodo actual en el documento. Por ejemplo, la expresión de predicado "preceding-sibling::book" selecciona los nodos del mismo nivel anteriores al nodo de libro. self Selecciona el nodo actual. Por ejemplo, la expresión de predicado "self::book" selecciona el nodo de libro actual.

    Andrés David Lizarazo Becerra

    Andrés David Lizarazo Becerra

    student•
    hace 5 años

    Predicados :

    n : Hace referencia al n elemento de la lista. last(): Al último elemento de la lista. @atribute_name : Al usarse como predicado me trae todos los nodos que contienen este atributo @atribute_name="" : Al usarse como predicado me trae todos los nodos que contienen este atributo, incluso el value de este atributo.

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads