Predicados en Xpath
Clase 10 de 21 • Curso de Fundamentos de Web Scraping con Python y Xpath
Contenido del curso
Clase 10 de 21 • Curso de Fundamentos de Web Scraping con Python y Xpath
Contenido del curso
Alan Vazquez
Francisco Garcia [C6]
karen gonzalez
Alejandro Giraldo Londoño
David Amador Morales
Moisés Manuel Morín Hevia
Juan David Sánchez
Moisés Manuel Morín Hevia
Jesús Zelaya Contreras
Bryan Javier Calero Robleto
Bryan Duarte
Moisés Manuel Morín Hevia
Diego Jurado
Luis Fernando Úbeda Camacho
Moisés Manuel Morín Hevia
César Ernesto Rivas Martínez
Luis Rogelio Reyes Hernandez
Oscar Jachilla Infantes
Eduardo Vera Sánchez
Moisés Manuel Morín Hevia
Andrés Molina
Juan Ochoa
Moisés Manuel Morín Hevia
Rubén Gustavo García Málaga
Cristhian Sanchez Medina
Ricardo Lopez
JUAN SEBASTIAN ZAPATA AVENDAÑO
Moisés Manuel Morín Hevia
Eduardo Héctor Taipe Límaco
Alan Kevin Fuentes García
Juan Fernando Moyano Ramírez
Carlos Andres Ocampo Pabon
Moisés Manuel Morín Hevia
Carolina Acosta Muñoz
Moisés Manuel Morín Hevia
Francisco Garcia [C6]
Moisés Manuel Morín Hevia
Carlos Javier Guevara Contreras
Andrés David Lizarazo Becerra
Comparacion de XPATH con CSS Selectors
| XPATH | CSS Selector | Descripcion |
|---|---|---|
| elemento[n] | :nth-child(n) | Numero de elemento |
| :nth-last-child(n) | Elementos empezando desde el ultimo | |
| elemento[last()] | :last-child | Ultimo elemento |
| elemento[@attr=value] | [attr=value] | Atributo con un valor especifico |
| .nombre-clase | Clase | |
| #nombre-id | ID |
# 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
Gracias compañero
gracias! que util
RESUMEN: Predicados Xpath
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
Predicados :
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.”"]
Alejandro, se aprecian mucho tus resúmenes, gracias.
Buen resumen.
He hecho un resumen de los predicados disponibles en XPath que aprendimos en esta clase.
!XPath Predicates
Buena forma visual.
Muy bueno !
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
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:
xD todo comienza en cero.
También estaba pensando en eso... si empieza en 0 o en 1
Los predicados siempre van entre corchetes [ ]
& sirven para filtrar mejor las expresiones.
$x('//span[@class="text"]/text()').map(x => x.wholeText)
// [] 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
Solo para aclarar, también ahora si funciona en navegador Microsoft Edge, así como en Chrome.
Así es compañero, de hecho funcionará en cualquier navegador basado en Chromium.
Nadie usa Edge xD xD
Todo esto funciona muy similar a la indentacion en python y al manejo de listas, no es igual pero si muy similar
Dejó más teoría de XPath https://www.mclibre.org/consultar/xml/lecciones/xml-xpath.html
Se agradece.
excelente aporte
Soy el único que hizo web spaping con los comentarios de la clase? 😈 $x('//p[@class="Content-author-name"]/text()').map(x => x.wholeText)
ya no funciona
Muy interesante
Super interesante.
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.
Hola! Basta con encerrar toda la expresión entre paréntesis antes de usar los corchetes:
$x('(//span[@class="text"])[1]');
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"]')
Pero entonces en sí ¿qué es un predicado? un predicado es una expresión xpath, pero no todas las expresiones xpath son predicados?
Sirve para Filtrar de forma especifica, son condiciones de filtrado. Modifican las expresiones.
Esquema elaborado por Facundo
No se ve la imagen.
listo
Soy yo.
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.
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.