No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Aprende todo un fin de semana sin pagar una suscripci贸n 馃敟

Aprende todo un fin de semana sin pagar una suscripci贸n 馃敟

Reg铆strate

Comienza en:

5D
2H
32M
22S

Wildcards en Xpath

12/21
Recursos

Aportes 31

Preguntas 4

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

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 鈥渢ext鈥, con @* trae todos los atributos. Dicho de otra forma, trae todos los atributos de todos los nodos de tipo span de clase 鈥渢ext鈥.
$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 鈥渢ext鈥 que tengan un atributo @itemprop 鈥渢ext鈥 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)聽["鈥淭he world as we have created it is a process of o鈥annot be changed without changing our thinking.鈥", "鈥淚t is our choices, Harry, that show what we truly are, far more than our abilities.鈥", "鈥淭here are only two ways to live your life. One is鈥 The other is as though everything is a miracle.鈥", "鈥淭he person, be it gentleman or lady, who has not 鈥re in a good novel, must be intolerably stupid.鈥", "鈥淚mperfection is beauty, madness is genius and it'鈥be absolutely ridiculous than absolutely boring.鈥", "鈥淭ry not to become a man of success. Rather become a man of value.鈥", "鈥淚t is better to be hated for what you are than to be loved for what you are not.鈥", "鈥淚 have not failed. I've just found 10,000 ways that won't work.鈥", "鈥淎 woman is like a tea bag; you never know how strong it is until it's in hot water.鈥", "鈥淎 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

Super Productiva esta clase !!!

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

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(鈥淪electionLanguage鈥,鈥淴Path鈥);
/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=鈥榚n鈥橾 Selects all the title elements that have a 鈥渓ang鈥 attribute with a value of 鈥渆n鈥
/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=鈥淯TF-8鈥?>

<bookstore>

<book>
<title lang=鈥渆n鈥>Harry Potter</title>
<price>29.99</price>
</book>

<book>
<title lang=鈥渆n鈥>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.

馃馃馃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.

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.

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!

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

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 鈥渘odename鈥
/ 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 鈥渂ookstore鈥
/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

He ido probando lo que voy aprendiendo en la p谩gina de mercadolibre, en este caso, tomo todos los nombres de los productos que aparecen cuando hago una busqueda usando esta linea:

$x('//h2[@class="ui-search-item__title shops__item-title"]/node()').map(x=>x.wholeText)

Seguro sera un curso para seguir consultando. Web scraping tiene muchas aplicaciones.

Excelente

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 鈥渢ext鈥, con @ trae todos los atributos, es decir, trae todos los atributos de todos los nodos de tipo span de clase 鈥渢ext鈥.
.
$x(鈥/html/body//div/@鈥) <- Todos los atributos (usando @) de todos los div (usando //div) que est谩n despu茅s de body
.
$x(鈥//span[@class=鈥渢ext鈥 and @itemprop=鈥渢ext鈥漖/node()鈥) <- Trae todos los spam que sean de clase 鈥渢ext鈥 que tengan un atributo @itemprop 鈥渢ext鈥 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=鈥渢ext鈥漖/@
    鈥) = 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.