Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Predicados en Xpath

10/21
Recursos

Aportes 28

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

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

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.”"]

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

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 😬

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

Los predicados siempre van entre corchetes [ ]

$x('//span[@class="text"]/text()').map(x => x.wholeText)

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

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

Muy interesante

Soy el único que hizo web spaping con los comentarios de la clase? 😈
$x(’//p[@class=“Content-author-name”]/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

Esquema elaborado por Facundo

listo

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.

También funciona en Firefox, entonces es mas bien una sentencia Js.

$x('//span[@class="text"]/text()').map(x => x.wholeText)

#Obtener los autores de las citas

$x('//span/small[@class="author"]/text()').map(x=>x.wholeText)

#Obtener todas las etiquedas

$x('//a[@class="tag"]/text()').map(x => x.wholeText)



map tambien funciona en firefox

muy buenoo

Ve pero a mi no me muestra nada…
$x(’//span[@class=“text”]/text()’).map(x => x.wholeText)

Predicados
$x(’ [Y] ')
Filtrar de forma especifica, son condiciones de filtrado.

= Filtra con base a su posición

last = último
@ = atributo
$x(’//span[@class=“text”]/text()’) = Los textos de las cajas span con la clase texto.

Interesante, básicamente el $x(xpath_hacia_el_tag_clase_atributo_buscado) funcionaría en JS como document.querySelector(el_tag_clase_atributo_buscado) para obtener el elemento deseado.

Aunque mucho de esto se simplifica con Frameworks como Selenium o Puppeter, pero esta genial tener una herramienta más de como realizar esto.

Si quieren comprobar que han creado bien el xpath les recomiendo la herramienta ChroPath. Es una extensión que se puede usar tanto en Chrome como en Mozilla. Si introducen un xpath les dice el número de veces que aparece y si es único marca la línea HTML a la que hace referencia. Es muy útil para saber si hemos creado bien el Xpath, aquí está el link a su web.

Buscar todos los autores. Bastante intuitivo! excelente.

$x('//small/text()').map(x => x.wholeText)

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

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

<h1>Predicados en Xpath</h1>

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"]')