Scrapy

Scrapy con selectores XPath

Scrapy con selectores XPath
HTML es el lenguaje de las páginas web, y hay mucha información entre la apertura y el cierre de cada página web html etiqueta. Hay muchas formas de acceder a esto, sin embargo, en este artículo lo haremos usando el selector Xpath a través de la biblioteca Scrapy de Python.

La biblioteca Scrapy es una biblioteca de raspado web muy poderosa, fácil de usar también. Si es nuevo en esto, puede seguir el tutorial disponible sobre el uso de la biblioteca Scrapy.

Este tutorial cubre el uso de selectores de XPath. Xpath utiliza una sintaxis similar a la ruta para navegar por los nodos de los documentos XML. También son útiles para navegar por etiquetas HTML.

A diferencia del tutorial de Scrapy, vamos a realizar todas nuestras operaciones aquí en la terminal por simplicidad. Sin embargo, esto no significa que Xpath no se pueda usar con el programa Scrapy adecuado, se pueden utilizar en la biblioteca de análisis en el parámetro de respuesta.

Vamos a estar trabajando con el ejemplo.raspado.com, ya que es muy simple y ayudaría a comprender los conceptos.

Para usar scrapy en nuestra terminal, escriba el siguiente comando:

$ scrapy shell http: // ejemplo.raspado.com

Visitaría el sitio y obtendría la información necesaria, luego nos dejaría con un shell interactivo con el que trabajar. Debería ver un mensaje como:

En 1]:

Desde la sesión interactiva, vamos a estar trabajando con el respuesta objeto.

Así es como se vería nuestra sintaxis para la mayor parte de este artículo:

En [1]: respuesta.xpath ('xpathsyntax').extraer()

Este comando anterior se usa para extraer todas las etiquetas coincidentes de acuerdo con la sintaxis de Xpath y luego lo almacena en una lista.

En [2]: respuesta.xpath ('xpathsyntax').extraer_primero ()

Este comando anterior se usa para extraer solo la primera etiqueta coincidente y la almacena en una lista.
Ahora podemos empezar a trabajar en la sintaxis de Xpath.

NAVEGAR ETIQUETAS

Navegar por las etiquetas en Xpath es muy fácil, todo lo que se necesita es la barra diagonal "/" seguida del nombre de la etiqueta.

En [3]: respuesta.xpath ('/ html').extraer()

El comando anterior devolvería el html etiqueta y todo lo que contiene como un solo elemento en una lista.

Si queremos obtener el cuerpo de la página web, usaríamos lo siguiente:

En [4]: ​​respuesta.xpath ('/ html / cuerpo').extraer()

XPath también permite el carácter comodín "*", que coincide con todo en el nivel en el que se utiliza.

En [5]: respuesta.xpath ('/ *').extraer()

El código anterior coincidiría con todo en el documento. Lo mismo sucede cuando usamos '/ html'.

En [6]: respuesta.xpath ('/ html / *').extraer()

Además de navegar por las etiquetas, podemos obtener todas las etiquetas descendientes de una etiqueta en particular usando el "//".

En [7]: respuesta.xpath ('/ html // a').extraer()

El código anterior devolvería todas las etiquetas de anclaje en la etiqueta html i.mi. devolvería una lista de todas las etiquetas de anclaje descendientes.

ETIQUETAS POR ATRIBUTOS Y SUS VALORES

A veces, navegar por las etiquetas html para llegar a la etiqueta requerida podría ser un problema. Este problema se puede evitar simplemente encontrando la etiqueta necesaria por su atributo.

En [8]: respuesta.xpath ('/ html // div [@id = "paginación"]').extraer()

El código anterior devuelve todos los div etiquetas debajo de la html etiqueta que tiene el identificación atributo con un valor de paginación.

En [9]: respuesta.xpath ('/ html // div [@class = "span12"]').extraer()

El código anterior devolvería una lista de todos los div etiquetas bajo la etiqueta html, solo si tienen el atributo de clase con un valor de span12.

¿Qué pasa si no conoce el valor del atributo?? Y todo lo que desea es obtener etiquetas con un atributo en particular, sin preocuparse por su valor. Hacer esto también es simple, todo lo que necesita hacer es usar solo el símbolo @ y el atributo.

En [10]: respuesta.xpath ('/ html // div [@class]').extraer()

Este código devolvería una lista de todas las etiquetas div que contienen el atributo de clase independientemente del valor que tenga ese atributo de clase.

¿Qué tal si conoces solo un par de caracteres contenidos en el valor de un atributo?? También es posible obtener ese tipo de etiquetas.

En [11]: respuesta.xpath ('/ html // div [contiene (@id, "ion")]').extraer()

El código anterior devolvería todas las etiquetas div bajo la etiqueta html que tienen el atributo id, sin embargo, no sabemos qué valor tiene el atributo, excepto que sabemos que contiene "ion".

La página que estamos analizando tiene solo una etiqueta en esta categoría, y el valor es "paginación", por lo que se devolvería.

Guay, verdad?

ETIQUETAS POR TEXTO

Recuerde que anteriormente hicimos coincidir las etiquetas por sus atributos. También podemos hacer coincidir las etiquetas por su texto.

En [12]: respuesta.xpath ('/ html // a [.= "Argelia"] ').extraer()

El código anterior nos ayudaría a obtener todas las etiquetas de anclaje que tienen el texto "Argelia" en ellas. NB: Deben ser etiquetas con exactamente ese contenido de texto.

Maravilloso.

¿Qué tal si no conocemos el contenido exacto del texto y solo conocemos algunos del contenido del texto?? Podemos hacer eso también.

En [13]: respuesta.xpath ('/ html // a [contiene (texto (), "A")]').extraer()

El código anterior obtendría las etiquetas que tienen la letra "A" en su contenido de texto.

EXTRACCIÓN DEL CONTENIDO DE LA ETIQUETA

Todo el tiempo, hemos estado hablando de encontrar las etiquetas adecuadas. Es hora de extraer el contenido de la etiqueta cuando la encontremos.

Es bastante simple. Todo lo que tenemos que hacer es agregar "/ text ()" a la sintaxis, y se extraerá el contenido de la etiqueta.

En [14]: respuesta.xpath ('/ html // a / text ()').extraer()

El código anterior obtendría todas las etiquetas de anclaje en el documento html y luego extraería el contenido del texto.

EXTRAER LOS ENLACES

Ahora que sabemos cómo extraer el texto en etiquetas, deberíamos saber cómo extraer los valores de los atributos. La mayoría de las veces, los valores de los atributos que son de suma importancia para nosotros son los enlaces.

Hacer esto es casi lo mismo que extraer los valores de texto, sin embargo, en lugar de usar "/ text ()" estaríamos usando el símbolo "/ @" y el nombre del atributo.

En [15]: respuesta.xpath'/ html // a / @ href').extraer()

El código anterior extraería todos los enlaces en las etiquetas de anclaje, se supone que los enlaces son los valores del href atributo.

NAVEGANDO LAS ETIQUETAS DE HERMANOS

Si lo ha notado, hemos estado navegando por etiquetas durante todo este tiempo. Sin embargo, hay una situación que no hemos abordado.

¿Cómo seleccionamos una etiqueta en particular cuando las etiquetas con el mismo nombre están en el mismo nivel??




Afganistán




Islas Aland


En un caso como el que tenemos arriba, si vamos a mirarlo, podríamos decir que usaríamos extraer_primero () para conseguir el primer partido.

Sin embargo, ¿y si queremos igualar el segundo?? ¿Qué pasa si hay más de diez opciones y queremos la quinta?? Vamos a responder eso ahora mismo.

Aquí está la solución: cuando escribimos nuestra sintaxis Xpath ponemos la posición de la etiqueta que queremos entre corchetes, al igual que estamos indexando pero el índice comienza en 1.

Si mira el html de la página web con la que estamos tratando, notará que hay muchos etiquetas en el mismo nivel. Para conseguir el tercero etiqueta, usaríamos el siguiente código:

En [16]: respuesta.xpath ('/ html // tr [3]').extraer()

También notarías que el las etiquetas son de dos en dos, si queremos solo la segunda etiquetas de la filas haríamos lo siguiente:

En [17]: respuesta.xpath ('/ html // td [2]').extraer()

CONCLUSIÓN:

XPath es una forma muy poderosa de analizar archivos html y podría ayudar a minimizar el uso de expresiones regulares al analizarlos considerando que tiene la contiene función en su sintaxis.

Hay otras bibliotecas que permiten analizar con Xpath como Selenium para la automatización web. XPath nos brinda muchas opciones al analizar html, pero lo que se ha tratado en este artículo debería poder llevarlo a través de operaciones comunes de análisis de html.

Tutorial de Shadow of the Tomb Raider para Linux
Shadow of the Tomb Raider es la duodécima incorporación a la serie Tomb Raider, una franquicia de juegos de acción y aventuras creada por Eidos Montre...
Cómo impulsar FPS en Linux?
FPS significa Cuadros por segundo. La tarea de FPS es medir la velocidad de fotogramas en reproducciones de video o actuaciones de juegos. En palabras...
Los mejores juegos de Oculus App Lab
Si es propietario de un visor Oculus, debe estar informado sobre la descarga lateral. Sideloading es el proceso de instalación de contenido que no es ...