Screapy con selectores XPath

Screapy con selectores XPath
HTML es el idioma 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 maneras de acceder a esto, sin embargo, en este artículo lo haríamos usando el selector XPath a través de la biblioteca de 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 de Scrapy.

Este tutorial cubre el uso de selectores XPath. XPath usa ruta como sintaxis para navegar por los nodos de los documentos XML. También son útiles para navegar en etiquetas HTML.

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

Vamos a trabajar con el ejemplo.embarcadero.Sitio com, ya que es muy simple y ayudaría a comprender los conceptos.

Para usar Scrapy en nuestro terminal, escriba el comando a continuación:

$ scrape shell http: // ejemplo.embarcadero.comunicarse

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

En 1]:

Desde la sesión interactiva, vamos a trabajar 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').extracto()

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').Extract_first ()

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

Navegar en las etiquetas

Navegar las etiquetas en XPath es muy fácil, todo lo que se necesita es el "/" de ventaja hacia adelante seguido del nombre de la etiqueta.

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

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').extracto()

XPath también permite al personaje comodín "*", que coincide con todo en el nivel en el que se usa.

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

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

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

Asides de navegación de etiquetas, podemos obtener todas las etiquetas descendientes de una etiqueta en particular usando el "//".

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

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 descendiente.

Etiquetas por atributos y sus valores

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

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

El código anterior devuelve todo el div Etiquetas bajo el html etiqueta que tiene el identificación atributo con un valor de paginación.

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

El código anterior devolvería una lista de todos los div Etiquetas debajo de 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 quieres es obtener etiquetas con un atributo particular, sin preocupación 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]').extracto()

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 personajes 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")]').extracto()

El código anterior devolvería todas las etiquetas DIV en la etiqueta HTML que tienen el atributo de identificación, sin embargo, no sabemos qué valor posee el atributo, excepto que sabemos que contiene "ion".

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

Guay, verdad?

Etiquetas por su texto

Recuerde que coincidimos con las etiquetas por sus atributos antes. También podemos hacer coincidir las etiquetas por su texto.

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

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

Maravilloso.

¿Qué tal si no sabemos en el contenido de texto exacto, y solo conocemos algunos de los contenidos de texto?? También podemos hacer eso.

En [13]: respuesta.xpath ('/html // a [contiene (text (), "a")]').extracto()

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

Extraer contenido de etiqueta

Todo el tiempo hemos estado hablando de encontrar las etiquetas correctas. Es hora de extraer el contenido de la etiqueta cuando la encontramos.

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

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

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

Extracción de los enlaces

Ahora que sabemos cómo extraer el texto en etiquetas, entonces debemos 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 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').extracto()

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.

Navegar etiquetas de hermanos

Si notaste, hemos estado navegando en etiquetas todo esto mientras. 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 lo miramos, podríamos decir que usaríamos Extract_first () Para obtener el primer partido.

Sin embargo, ¿qué pasa si queremos coincidir con el segundo?? ¿Qué pasa si hay más de diez opciones y queremos el quinto?? Vamos a responder eso ahora mismo.

Aquí está la solución: cuando escribimos nuestra sintaxis XPath, colocamos la posición de la etiqueta que queremos en los soportes cuadrados, al igual que estamos indexando, pero el índice comienza en 1.

Mirando el HTML de la página web con la que estamos tratando, notaría que hay mucho Etiquetas en el mismo nivel. Para obtener el tercero Etiqueta, usaríamos el siguiente código:

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

También notarías que el Las etiquetas están en dos, si solo queremos el segundo Etiquetas del Filas que haríamos lo siguiente:

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

CONCLUSIÓN:

XPath es una forma muy poderosa de analizar archivos HTML, y podría ayudar a minimizar el uso de expresiones regulares para analizarlos teniendo en cuenta que tiene el contiene función en su sintaxis.

Hay otras bibliotecas que permiten el análisis con XPATH como Selenium para la automatización web. XPath nos ofrece muchas opciones mientras analiza HTML, pero lo que se ha tratado en este artículo debería poder llevarlo a través de operaciones comunes de análisis HTML.