Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Wildcards en Xpath

12/21
Recursos

Aportes 29

Preguntas 4

Ordenar por:

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

Wilcards = comodines

Ejemplos

$x('/') <- Trae todo el documento porque representa la raíz de nuestro el html
$x('/*') <- * después de / pide que traiga todos los nodos que están debajo de / (* es el primer wildcard)
$x('/html/*') <- Trae todos los nodos que están inmediatamente después de html
$x('//*') <- // es la expresión para saltar todos los niveles y con el * en todas las direcciones. Trae todos los nodos y todos los atributos de estos nodos.
$x('//span[@class="text]/@*') <- Trae todos los span, que tengan como clase “text”, con @* trae todos los atributos. Dicho de otra forma, trae todos los atributos de todos los nodos de tipo span de clase “text”.
$x('/html/body//div/@*') <- Todos los atributos (usando @*) de todos los div (usando //div) que están después de body
$x('//span[@class="text" and @itemprop="text"]/node()') <- Trae todos los spam que sean de clase “text” que tengan un atributo @itemprop “text” y de ahí (usando node()) traer todo lo que esté dentro de los spam que cumplen las condiciones

node() a diferencia de * trae no solamente los nodos, sino también todo el contenido

RESUMEN:Wildcards en Xpath

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

Son comodines que usamos cuando no tenemos claro lo que queremos extraer.

  • /* : Con asterisco le estoy diciendo que me traiga todos los nodos inmediatamente después de la expresión.
  • //* : En este caso le estoy diciendo que estoy saltando en todos los niveles en todas las direcciones.
  • @*: Traer todos los atributos de todos los nodos
  • /node() : Nos trae además de nodos el contenido, difiere de asterisco.

Ejemplo:

x('//span[@class="text" and @itemprop="text"]/node()').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.”"]

Aqui si se queda muy corto CSS Selector ya que solo tiene el wildcard del *

# Selecciona todos los elementos hijos del html
$$('html > *')

# Selecciona todos los documentos
$$('*')

De los que me voy dado cuenta es que por si solo XPATH es mucho mas poderoso, pero con CSS ganas una sintanxis mucho mas corta y limpia, pero tienes que usar mas heramientas dadas por el lenguaje de programacion. Ya es cuestion de costumbres, pero aun asi le digo viendo mas ventajas a usar Selectores de CSS.
O en su defecto puedes usar XPATH para estos tipos de casos particulares

$x('/*') // trae todos los nodos que estan dentro del documento

$x('/html/*') // trae todos los nodos que estan inmediatamente despues del html

$x('//*') // trae todos los elementos que se encuentran en el documento

$x('//span[@class="text"]/@*') // trae todos los atributos de todos los span que tengan la clase texto

$x('/html/body//div/@*') // trae todos los atributos de todos los elementos div que estan dentro del body

$x('//span[@class="text" and @itemprop="text"]/*') // en este caso no trae nada ya que adentro solo hay texto plano no hay nodos

$x('//span[@class="text" and @itemprop="text"]/node()') // en todos los span que tengan como atributo class="text" and itemprop="text" trae todo el contenido esto es distinto a usar *, ya que aqui trae el contenido y texto plano de estos elementos a pesar que no estan dentro de un elemento html

Predicates
Predicates are used to find a specific node or a node that contains a specific value.

Predicates are always embedded in square brackets.

In the table below we have listed some path expressions with predicates and the result of the expressions:

Path Expression Result
/bookstore/book[1] Selects the first book element that is the child of the bookstore element.
Note: In IE 5,6,7,8,9 first node is[0], but according to W3C, it is [1]. To solve this problem in IE, set the SelectionLanguage to XPath:

In JavaScript: xml.setProperty(“SelectionLanguage”,“XPath”);
/bookstore/book[last()] Selects the last book element that is the child of the bookstore element
/bookstore/book[last()-1] Selects the last but one book element that is the child of the bookstore element
/bookstore/book[position()❤️] Selects the first two book elements that are children of the bookstore element
//title[@lang] Selects all the title elements that have an attribute named lang
//title[@lang=‘en’] Selects all the title elements that have a “lang” attribute with a value of “en”
/bookstore/book[price>35.00] Selects all the book elements of the bookstore element that have a price element with a value greater than 35.00
/bookstore/book[price>35.00]/title Selects all the title elements of the book elements of the bookstore element that have a price element with a value greater than 35.00

XPath uses path expressions to select nodes or node-sets in an XML document. The node is selected by following a path or steps.

The XML Example Document
We will use the following XML document in the examples below.

<?xml version=“1.0” encoding=“UTF-8”?>

<bookstore>

<book>
<title lang=“en”>Harry Potter</title>
<price>29.99</price>
</book>

<book>
<title lang=“en”>Learning XML</title>
<price>39.95</price>
</book>

</bookstore>

/* : Con asterisco le estoy diciendo que me traiga todos los nodos inmediatamente después de la expresión.
//* : En este caso le estoy diciendo que estoy saltando en todos los niveles en todas las direcciones.
@*: Traer todos los atributos de todos los nodos
/node() : Nos trae además de nodos el contenido, difiere de asterisco

Xpath realmente es a html lo que expresiones regulares son a texto, ya quiero verlo en acción en un proyecto.

Por si alguien quiere revisar documentación, esta está muy buena para digerir y apoyarse.

Super Productiva esta clase !!!

Selecting Nodes
XPath uses path expressions to select nodes in an XML document. The node is selected by following a path or steps. The most useful path expressions are listed below:

Expression Description
nodename Selects all nodes with the name “nodename”
/ Selects from the root node
// Selects nodes in the document from the current node that match the selection no matter where they are
. Selects the current node
… Selects the parent of the current node
@ Selects attributes

En caso que se quiera ser más especifico con la búsqueda se pueden usar predicados $x('//span[@class="text" and @itemprop="text"]/node()')[0]

Selecting Unknown Nodes
XPath wildcards can be used to select unknown XML nodes.

Wildcard Description

  • Matches any element node
    @* Matches any attribute node
    node() Matches any node of any kind

In the table below we have listed some path expressions and the result of the expressions:

Path Expression Result
/bookstore/* Selects all the child element nodes of the bookstore element
//* Selects all elements in the document
//title[@*] Selects all title elements which have at least one attribute of any kind
Selecting Several Paths
By using the | operator in an XPath expression you can select several paths.

In the table below we have listed some path expressions and the result of the expressions:

Path Expression Result
//book/title | //book/price Selects all the title AND price elements of all book elements
//title | //price Selects all the title AND price elements in the document
/bookstore/book/title | //price Selects all the title elements of the book element of the bookstore element AND all the price elements in the document

In the table below we have listed some path expressions and the result of the expressions:

Path Expression Result
bookstore Selects all nodes with the name “bookstore”
/bookstore Selects the root element bookstore
Note: If the path starts with a slash ( / ) it always represents an absolute path to an element!

bookstore/book Selects all book elements that are children of bookstore
//book Selects all book elements no matter where they are in the document
bookstore//book Selects all book elements that are descendant of the bookstore element, no matter where they are under the bookstore element
//@lang Selects all attributes that are named lang

¿Puedo extraer todos los comentarios de instagram?, estoy pensando en el problema de la paginación…

Excelente

"wildcards Xpath" 
* es el wilcard un comodin 
$x('/html/*') 
$x('//span[@class="text"]/@*')
$x('/html/body//div/@*')
/ node va mas alla de textos 
$x('//span[@class="text" and @itempromp"text"]/node()')

Excelente

Encantado de poder aprender más y más de esta herramienta.

Me gusta mucho como enseña Facundo, excelente, pero creo que para optimizar estaría bien limpiar la consola después de uno o dos comandos para tener mayor visibilidad como espectador.

Saludos!

Como recomendación para futuros videos, procuren que el video tenga margen inferior suficiente para evitar que los controles del reproductor tapen la explicación.

Excelente

🤖🤖🤖Wildcards🤖🤖🤖
Son comodines que usamos cuando no tenemos claro lo que queremos extraer.
/* : Con asterisco le estoy diciendo que me traiga todos los nodos inmediatamente después de la expresión.
//* : En este caso le estoy diciendo que estoy saltando en todos los niveles en todas las direcciones.
@*: Traer todos los atributos de todos los nodos
/node() : Nos trae además de nodos el contenido, difiere de asterisco.

Resumen:
.
$x(’/’) <- Trae todo el documento porque representa la raíz de nuestro el html
.
$x(’/’) <- * después de / pide que traiga todos los nodos que están debajo de / ( es el primer wildcard)
.
$x(’/html/’) <- Trae todos los nodos que están inmediatamente después de html
.
$x(’//
’) <- // es la expresión para saltar todos los niveles y con el * en todas las direcciones. Trae todos los nodos y todos los atributos de estos nodos.
.
$x(’//span[@class="text]/@’) <- Trae todos los span, que tengan como clase “text”, con @ trae todos los atributos, es decir, trae todos los atributos de todos los nodos de tipo span de clase “text”.
.
$x(’/html/body//div/@’) <- Todos los atributos (usando @) de todos los div (usando //div) que están después de body
.
$x(’//span[@class=“text” and @itemprop=“text”]/node()’) <- Trae todos los spam que sean de clase “text” que tengan un atributo @itemprop “text” y de ahí (usando node()) traer todo lo que esté dentro de los spam que cumplen las condiciones
.
node() a diferencia de * trae no solamente los nodos, sino también todo el contenido

Les comparto un cheatsheet que encontre de Xpath: https://devhints.io/xpath

Wildcards / Comodines
No sé el nodo de extracción pero sé el lugar en el que está. No sé como se llama pero si donde está.

  • = Todos los nodos inmediatamente después.
    $x(’//’) = Traerá tos los nodos & los atributos.
    $x(’//span[@class=“text”]/@
    ’) = Todos los atributos de todos los nodos de los span que tienen como clase a text.
    node() = Trae nodos y contenido.

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>Wildcards en Xpath</h1>

Que pasa si no sabemos el lugar exacto en el que se encuentra el nodo que queremos escrapear, pero si sabemos mas o menos donde se encuentra?. En estos casos tenemos una solucion llamada wildcards, o en español, comodines.

El primer comodin nos sirve para indicar que queremos traer todos los nodos que estan inmediatamente despues:

$x('/*')
#con este comodin podemos traer nodos que no sabaemos como se llaman pero si sabemos donde se encuentran

Si recordamos, con $x(’//’) podemos saltar niveles en XPath, y con * seleccionamos todos los nodos que se encuentran inmediatamente despues. Pero si combinamos
estas dos expresiones, seleccionamos todos los nodos en todas direcciones, o en otras palabras, lo seleccionamos todo:

$x('//*')

Por otro lado, el siguiente wildcard nos trae a todos los nodos span que tengan clase text:

$x('//span[@class="text"]/@*')

El siguiente wildcard nos permite traer todos los atributos de los nodos div:

$x('/HTML/body//div/@*')

Finalmente, tenemos un wildcard que nos permite traernos todo lo que se encuentra inmediatamente despues de donde estamos, sean nodos, texto o culaquier tipo de elementos:

$x('//span[@class="text" and @itemprop="text"]/node()')

#con esto traemos todo lo que se encuentra despues, independientemente de lo que sea.