Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Construcción de las expresiones de XPath

18/21
Recursos

Aportes 104

Preguntas 19

Ordenar por:

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

Por si a alguien le interesa yo uso un gadget para chrome llamado SelectorGadget
Este es similar a cuando te metes a revisar el elemento en modo inspeccionar elemento que te va marcando el elemento seccionado. Pero a diferencia este te manda todos los elementos que conciden con cierta busqueda de CSS Selector ( Y tambien te lo muestra en XPATH), asi ya no te tiene que romper la cabeza por que elemento pertenece a cada uno, solo activas el gadget y eliges el elemento que quieres obtener, si salen de mas los puedes eliminar o puedes agregar

según vi existe una nueva actualilzación y se podria hacer con

$x('//h2/a/@href').map(x=>x.value)

Así quedó mi archivo xpath.txt, no sé si es que del tiempo que se hizo la clase al día de hoy (Julio 12 del 2020) las personas de La República hicieron cambios en su estructura y los XPaths de la clase no traen los datos correctamente.

Links = //div/a[contains(@class, "kicker")]/@href
Título = //div/h3[contains(@class, "kicker")]/following-sibling::h2/a/text()
Resumen = //div[@class="lead"]/p/text()
Cuerpo = //div[@class="html-content"]/p/text()

La mejor manera de hacerlo hasta el día de hoy (20 abril 2021):

Links = $x('//h2/a/@href').map(x=>x.value)

Title = //div[@class="mb-auto"]/h2/span/text()

Abstract = //div[@class="lead"]/p/text()

Content = //div[@class="html-content"]/p/text()

Para el 2022:

links= $x('//h2/a/@href').map(x=>x.value)

Titulo = $x('//div[@class="mb-auto"]/h2/span/text()').map(x=>x.wholeText)

Resumen = $x('//div[@class = "lead"]/p/text()').map(x=>x.wholeText)

Cuerpo = $x('//div[@class = "html-content"]/p[not (@class)]/text()').map(x=>x.wholeText)

RESUMEN:Desarrollo proyecto

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

Construimos expresiones Xpath para las los titulos, links, resumen y cuerpo.

Las expresiones Xpath pueden variar en función del sitio web y los desarrolladores.
Por lo que las expresiones debe estar en constante revisión.


  1. Crear un archivo xpath.txt para almacenar las expresiones que corresponden.
xpath.txt Date 6 AGU 2020

links  = //h2[@style]/a/@href
titles = //div[@class="mb-auto"]/h2/a/text()
resume = //div[@class="wrap-post col-9"]/div/div[@class="lead"]/p/text()
body = //div[@class="html-content"]/p[not(@class)]/text()

Para el Espectador:

$x('//h2/a/@href').map(x=>x.value)

A enero 7 del 2021:

Links = //h2/a/@href

Titulo = //h2/a/text()

resumen = //div[@class="lead"]/p/text()

cuerpo = //div[@class="html-content"]/p[not(@class)]/text()

En el navegador
links = $x(’//h2[not(@class)]/a/@href’).map(x => x.value)
Titulo = $x(’//div[@class=“mb-auto”]/h2/a/text()’).map(x => x.wholeText)
resumen = $x(’//div[@class=“lead”]/p/text()’).map(x => x.wholeText)
cuerpo = $x(’//div[@class=“html-content”]/p/text()’).map(x => x.wholeText)
autor = $x(’//div[@class=“autorArticle”]/p/text()’).map(x => x.wholeText)
**
Archivo txt**
links = $x(’//h2[not(@class)]/a/@href’)
Titulo = $x(’//div[@class=“mb-auto”]/h2/a/text()’)
resumen = $x(’//div[@class=“lead”]/p/text()’)
cuerpo = $x(’//div[@class=“html-content”]/p/text()’)
autor = $x(’//div[@class=“autorArticle”]/p/text()’)

Así quedó mi código para hoy 16/10/2020

Links = //h2/a/@href
Title = //div[@class="mb-auto"]/h2/a/text()
Summary = //div[@class="lead"]/p/text()
Author = //div[@class="autorArticle"]/p/text()
Body = //div[@class="html-content"]/p/text()

Me pareció interesante agregar el autor del texto porque quizá pueda ser un dato importante para analizar luego, como ver cuantos artículos ha escrito cada autor entre otros.

Por otro lado, me parece interesante el hecho de que se pueda dejar sin el [not(@class)] aunque puede ser contraproducente, pues me imagino que si no se le agrega el código anterior, puede tomar datos que no son los que estamos esperando, si alguien pudiese confirmar sería excelente.

Al 19 de abril de 2021

Links =//h2/a/@href
Titulo = //h2/span/text()
Resumen = //div[@class="lead"]/p/text()
Cuerpo = //div[@class="html-content"]/p[not(@class)]/text()
Autor = //div[@class="autorArticle"]/p/text()

Hola,
para poder traer el texto completo para el cuerpo, inlcuyendo lo que esta en el nodo <u> 'texto <u/> , utilice un join entre texto de nodos quedando con la siguiente expresión:

$x(’//div[@class=“html-content”]/p/text() | //div[@class=“html-content”]/p/u/text()’)

A diciembre de 2021

Links = //h2/a/@href

Titulo = //div[@class="mb-auto"]/h2/span/text()

Resumen = //div[@class = "lead"]/p/text()

Cuerpo = //div[@class = "html-content"]/p[not (@class)]/text()

para quienes lo hagan cuando la republica usa vue fecha del comentario 13 nov 2020

//h2[@style="font-size: 42px; line-height: 46px;"]/a/@href (link titular principal)
//h2[@style="font-size: 42px; line-height: 46px;"]/a/text() (titular principal)

//h2[@style="font-size: 17px; line-height: 21px;"]/a/@href (link otros titulares)
//h2[@style="font-size: 17px; line-height: 21px;"]/a/text() (titulares)

//div[@class="lead"]/p/text() (resumen)
//div[@class="news"]/p/text() (contenido)

Para el Tiempo

Links = //h3[@class="title-container"]/a/@href
Titulo = //h1[@class="titulo"]/text()
Resumen = //div[@class = "lead"]/p/text()
Cuerpo = //div[@class = "modulos"]/p[@class = "contenido"]/text()```

**Actualizado: ** 02/05/2022
Links = //h2/a/@href
Titulo = //h2[@class=""]/span/text()
Resumen = //div[@class=“lead”]/p/text()
Cuerpo = //div[@class=“html-content”]/p/text()

Para Marzo 2022, me funciono: se aceptan consejos o regaños:

<code> 

$x('//h2/a/@href').map(x => x.value)

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

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

$x('//section[@class="section-visibility"]/p//text()').map(x => x.wholeText)
</code>

Comparto las expresiones de XPath que me salieron a la fecha de 11/12/2021.

  • Links
$x('//h2[@data-h]/a/@href').map(x => x.value)
  • Titulo
$x('//h2/span/text()').map(x => x.wholeText)
  • Resumen
$x('//div[@class="lead"]/p/text()').map(x => x.wholeText)
  • Cuerpo
$x('//div[@class="html-content"]/p[not(@class)]/text()').map(x => x.wholeText)

Estas son las rutas que me salieron al 6/11/2021:

Links = //h2/a/@href
Título = //div[@class="mb-auto"]/h2/span/text()
Resumen = //div[@class="lead"]/p/text()
Cuerpo = //div[@class="html-content"]/p[not(@class)]/text()

04/08/2021 1:53 am

Links = $x('//div[@class="V_Trends"]/h2/a/@href').map(x => x.value)

Título = $x('//div[@class="mb-auto"]/h2/span/text()').map(x => x.wholeText)
Encabezado = $x('//div[@class="lead"]/p/text()').map(x => x.wholeText)

Cuerpo = $x('//div[@class="html-content"]/p[not(@class)]/text()').map(x => x.wholeText)

En la página no aparecía ningún class dentro del título sino una “Custom attribute” por lo que decidí utilizarlo de todos modos…

$x('//h2[@data-h="45"]/span/text()').map(x => x.wholeText)

A la fecha de mi publicación (21 de Enero de 2021) y desde Mozilla así fue como pude sacar el texto de los encabezados de las noticias de la sección de economía. La estructura html del sitio cambió de nuevo y ahora dividen los links de los encabezados por clases de la sección de noticias correspondiente, se me hizo algo muy padre.

$x(’//h2/a[@class=“economiaSect”]/text()’).map(x=>x.nodeValue)

y así pude sacarles los links

$x(’//h2/a[@class=“economiaSect”]/@href’).map(x=>x.nodeValue)

Efectivamente se actualizo la pagina, dejo mi aporte de como quedaría a la fecha de hoy (2/5/2021)

Saludos

Dejo las expresiones que funcionan al día de hoy 23 de Marzo de 2021

Links = //h2/a/@href
Titulo = //div[@class="mb-auto"]/h2/span/node()
Resumen = //div[@class="lead"]/p/node()
Cuerpo = //div[@class="html-content"]/p[not(@class)]/text()

El sitio web ha cambiado un poquito desde la creación del curso, entonces dejaré aquí las expresiones Xpath que usé para extraer la información de la página en la fecha 17/01/2021.
­
Para las 6 noticias en la parte de arriba de la página principal usé este:

$x('//div[@class="news V_Title_Img"]/h2/a/@href')

Y para traer algunas más usé:

$x('//div[@class="V_Title" or @class="news V_Title_Img" or @class="col-7 pl-3 pr-3"]/h2/a/@href')

//Hay algunas noticias que no logré conseguir porque cambian mucho en formato

Para poder traer los títulos utilicé este:

$x('//h2[@style="font-size: 45px; line-height: 49px;" or @style="font-size: 44px; line-height: 48px;"]/a/text()')

//Hay algunos títulos que cambian un poquito el formato del titulo

Para poder traer el resumen usé esto:

$x('//div[@class="lead"]/p/text()')

//Es el mismo del curso

También quise traerme el autor de la noticia:

$x('//div[@class="autorArticle"]/p/text()')

Para poder traer el cuerpo de la noticia usé esto:

$x('//div[@class="html-content"]/p[not(@class)]/text()')

//Similar a la del curso

Como escribir etiquetas sin clase

Este es el código para extraer información de la página el 12/01/21

links = //div[@class="col-7 pl-0 pr-3"]/h2[not(@class)]/a/@href
titulo = //div[@class="mb-auto"]/h2[not(@class)]/a[@class="economiaSect"]/text()
resumen = //div[@class="news economiaSect"]/div[@class="lead"]/p/text()
cuerpo = //*[contains(concat( " ", @class, " " ), concat( " ", "html-content", " " ))]/p/text()

La última línea la saqué con una extensión de Google

Al momento de ver esta clase 03-01-2021 no encontré class=“headline”, como el objetivo es tomar los links de los artículos de la pagina inicial use la siguiente expresión.

$x('//h2[@style]/a/@href').map(x=>x.value)

Al dia de hoy 1/1/2021, las expresiones que me funcionaron para extraer los datos fueron:

Links = //h2/a/@href
Titulo = //div[@class="mb-auto"]/h2/a/text()
Resumen = //div[@class="lead"]/p/text()
Cuerpo = //div[@class="html-content"]/p/text()

Espero les sea de utilidad

En realidad los errores en el minuto 2:00 son por qué usas un bloqueador de publicidad y arroja error al cargar la publicidad del sitio. Yo recomendaría usar una versión de Chrome Canary sin ninguna extensión instalada para hacer debug.

Muy productiva esta clase

Wooow!!! Es super emocionante recibir cursos con Facundo, que dicha poderlo encontrar en esta plataforma

Opté por hacer el proyecto con un portal de mi ciudad (Recife/Brasil): https://ne10.uol.com.br/

Hoy (29/11/2020), a mi me quedó así:
TÍTULO: $x('//div[@class="content"]/h1/text()').map(x => x.wholeText)
RESUMEN: $x('//div[@class="content"]/p/text()').map(x => x.wholeText)
CONTENIDO: $x('//div[@class="ocultarConteudo"]/p[@class="texto"]/text()').map( x => x.wholeText)

La estructura de las páginas web cambió. Opté por hacer el proyecto con un diario de mi ciudad: https://cronica.com.ec

Un ejemplo, por si ayuda a alguien

A mi me quedó así

Links = '//h2/a/@href'
Titulo = '//div[@class="col-8 order-2 d-flex flex-column"]//h2/a/text()'
resumen = '//div[@class="lead"]/p/text()'
cuerpo = '//div[@class="html-content"]/p[not(@class)]/text()'

Asi quedaron los XPath del sitio web el 25/Sep/2020:

Links = //div/a[contains(@class, "kicker")]/@href
Titulo = //div[@class="mb-auto"]/h2/a/text()
Resumen = //div[@class="lead"]/p/text()
Cuerpo = //div[@class="html-content"]/p[not(@class)]/text()

Recomiendo para El tiempo, y el espectador usar scrappy si se va a hacer una búsqueda a gran escala, porque si se usa beautifulSoup o Selenium, luego de un tiempo se bloquea la página.

Por si alguien le interesa la función para el espectador, es una pagina con una estructura muy rara

$x('//div[@class ="object node-node"]//*[self::h1 or self::h2 or self::h3 or self::h4]//@href').map(x=> x.value)

Ubicación de los links de las noticias en la página principal

  • “dic” cuya clase contiene “V”
  • “h2”
  • “a” cuya clase contiene “Sect”

XPath:

XPath: 
$x('//div[contains(@class, "V")]//h2/a[contains(@class, "Sect")]/text()').map(x=>x.wholeText)

Resultado:
Con esto obtuve 50 noticias, parece que estoy seleccionando las mismas cosas.

Para Infobae:

Links = //a[@data-pb-field="headlines.basic"]/@href
Title = //div[@class="row"]/header/h1/text()
Subtitle = //div[@class="row"]/header/span[@class="subheadline"]/text()
Body = //div[@id="article-content"]/div[@class="row pb-content-type-text"]//p/text()```

Estas son mis expresiones xpath

Links = //h2[@class]/a/@href
Title = //h2[@class and @data-h=“45”]/span/text()
Summary = //div[@class=“lead”]/p/text()
Content = //div[@class=“html-content”]/p/text()

Así me quedaron los míos hoy 10-04

Links = //h2/a//@href
Titulo = //div[@class=“mb-auto”]/h2/span/text()
Resumen = //div[@class=“lead”]/p/text()
Cuerpo = //div[@class=“html-content”]/p/text()

Espero le ayuden!!

Saludos.

Esta fue la línea de xpath que me sirvio ya que al escribirla con el condicional “not” no me generaba información.
Feb 2022

$x('//div[@class="row article-wrapper"]//p/text()').map(x=>x.wholeText)

Hola Esto es en feb 2022, para el titulo de la noticia.

$x('//div[@class="mb-auto"]/h2/span/text()’).map(x=>x.wholeText)
Links = //h2[@data-h]/a/@href
Title = //h2[@data-h]/span/text()
Summary = //div[@class="lead"]/p/text()
Body = //div[@class="html-content"]/p[not(@class)]/text()

En el cuerpo aparecen las etiquetas u o span o negritas, en ese caso para que las tome usé:
//div[@class=“html-content”]/p[not(@class)]//text()

En mi caso, en la expresion del cuerpo, tuve que agregar doble // despues de la p, para que me tomara el texto que que se encontrara dentro de alguna etiqueta, ej: <span> o <u>.

Asi queda en Enero del 2022:

Links = //div[@class = "V_Title"]/h2/a/@href
Title = //div[@class="mb-auto"]/h2/span/text()
Resumen = //div[@class="lead"]/p/text()
Body = //div[@class="html-content"]/p[not(@class)]/text()

👾

Sucede que extraer el párrafo completo cuando se tienen ciertas palabras en negrita es algo más complejo.

Encontré la siguiente solución usando axes xpath:

//div[@class="html-content"]/p/descendant-or-self::text()

Octubre 2021 (espero sea útil):

Links = $x(’//h2/a/@href’).map(x=>x.value)

Título = $x(’//h2[@data-h=“45”]/span/text()’).map(x => x.wholeText)

Resumen = $x(’//div[@class=“lead”]/p/text()’).map(x => x.wholeText)

Cuerpo = $x(’//div[@class=“html-content”]/p[not(@class)]/text()’).map(x => x.wholeText)

A día de Octubre 4 del 2021

Links = //h2/a/@href
Titulo = //h2[@class=""]/span/text()
Resumen = //div[@class="lead"]/p/text()
Cuerpo = //div[@class="html-content"]/p[not(@class)]/text()

**Dejo mis expresiones
**
Links : //h2/a/@href
titulo: //div[@class=“mb-auto”]/h2/span/text()
descrocion: //div[@class=“lead”]/p/text()
cuerpo: //div[@class=“html-content”]/p/text()

Así quedó mi archivo txt:

Links =  //h2/a/@href
Titulo = //div[@class="mb-auto"]/h2/span/text()
Resumen = //div[@class="lead"]/p/text()
Cuerpo = //div[@class="html-content"]/p[not(@class)]/text()

FECHA : 11/09/2021

Hago mi aporte de como obtenerlo a la fecha 17/08/2021

Links = $x('//h2/a/@href')

Titulo = $x('//div[@class ="col order-2"]/h2/span/text()')
Resumen = $x('//div[@class="lead"]/p/text()')
Cuerpo = $x('//div[@class="html-content"]/p[not(@class)]/text()')

Así quedo mi archivo xpath.txt

Links = //h2/a/@href
Titulo = //div[@class="container title-share"]//h2/span/text()
Resumen = //div[@class="lead"]/p/text()
Cuerpo = //div[@class="html-content"]/p[not(@class)]/text()

Yo estoy haciendo el curso en julio 2021: dejo mis resultados por que cambió la página.

Links = //h2/a/@href
Titulo = //h2[@data-h]/span/text()
Resumen = //div[@class=“lead”]/p/text()
Cuerpo = //div[@class=“html-content”]/p[not(@class)]/text()

Les comparto mi ** xpath.txt**

HOME_URL = 'https://www.larepublica.co/'

XPATH_LINK_TO_ARTICLE = '//a[@class="globoeconomiaSect"]/@href'
XPATH_TITLE = '//div[@class="mb-auto"]//span/text()'
XPATH_SUMMARY = '//div[@class="lead"]/p/text()'
XPATH_BODY = '//div[@class="html-content"]/p[not(@class)]/text()'

Al 16/Junio/2021

Links = //h2[@class=""]/a/@href
Titulo = //h1[@class="articleTitle large"]/a/text()
Resumen = //p[@class="intro hide-for-small show-for-large"]/text()
Cuerpo = //div[@class="cell"]/p[[email protected]()]/text()

Fecha: 09/07/2021

links = //a[contains(@class, "kicker")]/@href

titles = //span[contains( @class, "kicker")]/following-sibling::h2/span/text()

intro = //div[@class = "lead"]/p/text()

fulltext = //div[@class = "html-content"]/p[not(@class)]/text()

author = //div[@class = "autorArticle"]/p/text()    

Hola.
Les comparto la configuración del archivo xpath.txt al día de hoy (09/07/2021).

Un saludo 😃

Links = //h2[@class=contains(.,"kicker")]/a/@href
Titulo = //div[@class="mb-auto"]/h2/span/text()
Resumen = //div[@class="lead"]/p/text()
Cuerpo = //div[@class="html-content"]/p/text()

Para reafirmar un poco más los conocimientos del buen Facundo, les recomiendo ver también este video:

Estoy haciendo para mi portafolio un scraping de Platzi.

Para las Categorías desde la url ‘https://platzi.com/


enlaces de las categorías

$x('//div[@class="CategoriesSection"]/div/a/@href').map(x=>x.value)

Nombre de la categoría

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

Para las rutas de cada categoría desde el enlace de la categoría encontrado anteriormente


enlaces a las rutas

$x('//div[@class="LearningPathsList-content"]/a/@href').map(x=>x.value)

Para los datos de la ruta desde el enlace de cada ruta


imagen de la ruta

$x('//div[@class="Hero-route"]/div[@class="Hero-route-head"]//img/@src').map(x=>x.value)

nombre de la ruta

$x('//div[@class="Hero-route"]/div[@class="Hero-route-head"]//h1/text()').map(x=>x.wholeText)

descripción de la ruta

$x('//div[@class="Hero-route"]/div[@class="Hero-route-desc"]/span/text()').map(x=>x.wholeText)

Para los niveles de cada ruta


Descripción del nivel

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

Nombre del nivel

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

Proyecto del nivel

$x('//div[@class="RoutesList"]//h4[@class="Projects-info-name"]/text()').map(x=>x.wholeText)

Para los cursos de cada nivel


Imagen del curso

$x('//div[@class="RoutesList"]//a[@class="RoutesList-item"]//img/@src').map(x=>x.value)

Nombre del curso

$x('//div[@class="RoutesList"]//a[@class="RoutesList-item"]/h4/text()').map(x=>x.wholeText)

enlace del curso

$x('//div[@class="RoutesList"]//a[@class="RoutesList-item"]/@href').map(x=>x.value)

Estos son los códigos de Xpath para la diferente información requerida.

<links = //h2/a/@href
titulo = //h2[@data-h = “45”]/span/text()
resumen = //div[@class = “lead”]/p/text()
parrafos = //div[@class = “html-content”]/p/text()>

para los que tengan python 3.8 la instalación de modulo request falla se puede ejecutar con el siguiente comando

<code>

 python -m pip install requests

Mi código actualizado:

Links = //h2/a/@href
Título = //div[@class="mb-auto"]/h2/span/text()
Resumen = //div[@class="lead"]/p/text()
Cuerpo = //div[@class="html-content"]/p/text()

Al 27 de marzo del 2021:

Links = //h2/a/@href
Título = //h2/span/text()
Resumen = //div[@class="lead"]/p/text()
Cuerpo = //div[@class="html-content"]/p[not(@class)]/text()

Ya habia pasado este curso pero hoy volvi a repasar y a 24 de diciembre del 2020:
Los links son:

<Links=//h2/a/@href
Titulo= //div[@class="mb-auto"]/h2/a/text()
Resumen= //div[@class="lead"]/p/text()
Contenido= //div[@class="html-content"]/p[not(@class)]/text()>

XPaths a 16 Dec del 2020

Links = '//h2/a/@href'
News Title = '//div[@class="row OpeningPostNormal"]//h2/a/text()'
News Description = '//div[@class="lead"]/p/text()'
News Content = '//div[@class="html-content"]/p/text()' 

El HTML del sitio de La República cambió. Éste es el correcto hasta ahora (Noviembre 2020):

Links = '//h2[@class="headline"]/a/@href'
Titulo = '//h1/i/text()'
Resumen = '//div[@class="lead"]/p/text()'
Cuerpo = '//div[@class="html-content"]/p[not(@class)]/text()'

Probé hacerlo con otro portal de prensa: https://andina.pe/agencia/noticia-gobierno-lanza-campana-volver-para-reactivar-turismo-forma-gradual-818124.aspx

Pero no me aparece la información ¿Alguien sabe a qué! se debe? ![](

En mi caso use

links = //h2[@class="headline"]/a/@href
title = //h1[@class="globoeconomiaSect"]/i/text()
summary = //div[@class="lead"]/p/text()
description = //div[@class="html-content"]/p[not(@class)]/text()

Porsi a alguien le interesa yo uso un add de chorme que se llama Xpath helper.

XPATH al día 19 de Octubre 2020:

Links = $x('//h2/a/@href').map(x => x.value)
Titles = $x('//a[@class="empresasSect"]/text()').map(x => x.wholeText)
Summary  = $x('//div[@class="lead"]/p/text()').map(x => x.wholeText)
Body = $x('//div[@class="news empresasSect"]/div[@class="html-content"]/p[not(@class)]/text()').map(x => x.wholeText)
Links = $x('//h2[@class="headline"]/a/@href')
Title = $x('//a[@class="empresasSect"]/text()')
summary = $x('//div[@class="lead"]/p/text()')
body = $x('//div[@class="html-content"]/p[not(@class)]/text()')

Para los que usan Firefox, les puede interesar esta extensión

con ella se les copia al clipboard el XPath de los elementos que seleccionen, solo hace falta activarla -> seleccionar un elemento -> y pegar la ruta donde la necesiten y modificarla a su gusto 😄

Links = //h2[@class=“headline”]/a/@href
Titulo = //h1[@class=“headline”]/a/text()
Resumen = //div[@class=“lead”]/p/text()
Cuerpo = //div[@class="articleWrapper "]/p[not(@class)]/a/text()

Para el Diario Financiero

links = $x('//div[@id="wrap-noticias"]/div[3]/section[2]/div/article/div[2]/h2/a/@href')
tags = $x('//div[@id="wrap-noticias"]/div[3]/section[2]/div/article/div[2]/h4/a/text()')
titulo = $x('//div[@id="wrap-noticias"]/div[3]/section[2]/div/article/div[2]/h2/a/text()')

Para que verifiquen que todo quedó instalado en su entorno de trabajo utilicen el comando pip freeze, ahí encontraran autopep8, lxml y requests

Cambiaron la estructura en ese sitio, yo lo que hice fue irme a otro diario en este caso https://www.df.cl/ y ver su estructura

$x('//div[@class="col-md-8"]/h2/a/@href').map(x => x.value) ```

Aqui las cadenas xpath que construi hoy 27 de julio:

07.01 PARA OBTENER LOS ENLACES: XPATH: '//div/a[contains(@class,"kicker")]/@href' TEST JS: $x('//div/a[contains(@class,"kicker")]/@href').map(x => x.value) 07.02 PARA OBTENER LA CATEGORIA DE LA NOTICIA XPATH: '//h3[contains(@class,"kicker")]/text()' TEST JS: $x('//h3[contains(@class,"kicker")]/text()').map(x => x.wholeText) 07.03 PARA OBTENER LOS TITULOS XPATH: '//div[@class="mb-auto"]/h2/a/text()' TEST JS: $x('//div[@class="mb-auto"]/h2/a/text()').map(x => x.wholeText) 07.04 PARA OBTENER EL RESUMEN XPATH: '//div[@class="lead"]/p/text()' TEST JS: $x('//div[@class="lead"]/p/text()').map(x => x.wholeText) 07.05 PARA OBTENER EL AUTOR XPATH: '//div[@class="autorArticle"]/p/text()' TEST JS: $x('//div[@class="autorArticle"]/p/text()').map(x => x.wholeText.trim()) 07.05 PARA OBTENER EL CUERPO XPATH: '//div[@class="html-content"]/p/text()' TEST JS: $x('//div[@class="html-content"]/p/text()').map(x => x.wholeText)

Estas son las cadenas de xpath (con codigo JS para probar) que construi hoy 27 de julio, asi tambien agregue los campos adicionales de categoria y autor, ya que me gustaria incluir estos en mi proyecto:

LISTA DE ENLACES: $x(’//div/a[contains(@class,“kicker”)]/@href’).map(x => x.value)
CATEGORIA: $x(’//h3[contains(@class,“kicker”)]/text()’).map(x => x.wholeText)
TITULOS: $x(’//div[@class=“mb-auto”]/h2/a/text()’).map(x => x.wholeText)
RESUMEN: $x(’//div[@class=“lead”]/p/text()’).map(x => x.wholeText)
AUTOR: $x(’//div[@class=“autorArticle”]/p/text()’).map(x => x.wholeText.trim())
CUERPO: $x(’//div[@class=“html-content”]/p/text()’).map(x => x.wholeText)

Estas fueron mis expresiones a día de hoy 9 de agosto:

links = //h2[@style]/a/@href
titulo = //div[@class="mb-auto"]/h2/a/text()
resumen = //div[@class="news globoeconomiaSect"]/div[@class="lead"]/p/text()
cuerpo = //div[@class="news globoeconomiaSect"]/div[@class="html-content"]/p[not(@class)]/text()

Mis XPaths al final del curso:

XPATH_LINK_TO_ARTICLE = '//div[contains(@class, "V")]/a[contains(@class, "kicker")]/@href'
XPATH_TITLE = '//head/title/text()'
XPATH_SUMMARY =  '//div[@class="lead"]/p/text()'
XPATH_BODY = '//div[@class="html-content"]/p[not(@class)]/text()'

Excelente,

El mío quedo así Septiembre 2020

Links = //h2/a/@href
Titulo = //h2[@style="font-size: 47px; line-height: 51px;"]/a/text()
Resumen = //div[@class="lead"]/p/text()
Cuerpo = //div[@class="html-content"]/p[not(@class)]/text()

Las expresiones Xpath para hoy 7 de septiembre de 2020 son:

  • Enlaces de las noticias en La República
$x('//h2[not(@class)]/a/@href').map(x=>x.value)
  • Titulo dentro del enlace de la noticia
$x('//div[@class="mb-auto"]/h2/a/text()').map(x => x.wholeText)
  • Para extraer el resumen de la noticia

$x('//div[@class="lead"]/p/text()').map(x => x.wholeText)
  • Para extraer el cuerpo de la noticia

$x('//div[@class="html-content"]/p[not(@class)]/text()').map(x => x.wholeText)

Así quedo los XPaths de https://www.larepublica.co

Links = //h2/a/@href
Title = //h1/i/text()
Resume = //div[@class="lead"]/p/text()
Body = //div[@class="html-content"]/p[not(@class)]/text()

Hola, también pueden extraer datos con .data

Estoy usando esta urlde juegos de PS5 para pruebas:

$x('//li[@class="psw-cell"]/div/a/section/span/text()').map(x => x.data)

Expresiones Xpath a fecha de la web 15 de Abril de 2021:

Links:

//div[@class="V_Title"]/h2/a/@href

Título:

//div[@class="mb-auto"]/h2/span/text() 

Autor/a:

//div[@class="autorArticle"]/p/text()

Resumen:

//div[@class="lead"]/p/text()

Cuerpo:

//div[@class="html-content"]/p[not(@class)]/text()

Links = //h2/a/@href
Tittle = //h2/span/text()
Summary = //div[@class = “lead”]/p/text()
First_paragraph = //div[@class = “html-content”]/p[not(@class)]/span/text()
Body = //div[@class = “html-content”]/p[not(@class)]/text()

Al 7/4/2021

Links = //h2/a/@href
Titulos = //div[@class="mb-auto"]/h2/span/text()
Resumen = //div[@class="lead"]/p/text()
Cuerpo = //div[@class="html-content"]/p[not(@class)]/text(

Hoy 27/03 esto fue lo que me funcionó

Links = //h2/a/@href
Titulo = //div[@class = "container title-share"]//h2/span/text()
Resumen = //div[@class = "lead"]/p/text()
Cuerpo = //div[@class = "html-content"]/p[not(@class)]/text()

XPaths de Links, Titulo, Resumen y Cuerpo, a dia de hoy 19/3/2021.

Links = //h2/a/@href
Titles = (//h2/span/text())[1]
Resumen = //div[@class="lead"]/p/text()
Cuerpo = //div[@class="html-content"]/p[not(@class)]/text()

La estructura HTML del sitio web cambió, para hoy 15 de Marzo del 2021, pude acceder los link de todas las noticias con:

<$x(’//div[@class=“container”]//h2[@style and @data-h]/a/@href’).map(x=> x.value)>

Hola a todos, comparto como quedaron mis expresiones a fecha 11 de marzo de 2021:

#Para obtener el titulo uso la expresion: 
$x('//div[@class="mb-auto"]/h2/span/text()').map(x => x.wholeText)

#expresion para el resumen:
$x('//div[@class="lead"]/p/text()').map(x => x.wholeText)

#expresion para el cuerpo:
$x('//div[@class="html-content"]/p[not(@class)]/text()').map(x => x.wholeText)

Vaya que ha cambiado la pagina, hoy 04/03/2021 para poder sacar los links de las noticias, encontre todos estos Xpath porque dependiendo de donde se encontraban las noticias, tenian diferente HTML

Links= $x('//div[@class="V_Title"]/h2/a/@href').map(x=>x.value)
$x('//h2[@class="headline"]/a/@href').map(x=>x.value)
$x('//div[@class="container"]/div/div/div/div[@class="col-7 pl-0 pr-3"]/a/@href').map(x=>x.value)
$x('//div[@class="news V_Title_Img"]/a/@href').map(x=>x.value)
$x('//div[@class="V_Trends"]/a/@href').map(x=>x.value)

Y no se si hay mas, pero esos fueron los que logre sacar

Yo estoy haciendo de mi Pagina favorita para leer mangas háblenme al interno para saber cual es.