Scrapy - Selectores

Descripción

Cuando está raspando las páginas web, necesita extraer una determinada parte de la fuente HTML mediante el mecanismo llamado selectors, logrado mediante el uso de expresiones XPath o CSS. Los selectores se basan enlxml biblioteca, que procesa XML y HTML en lenguaje Python.

Utilice el siguiente fragmento de código para definir diferentes conceptos de selectores:

<html>
   <head>
      <title>My Website</title>
   </head>
   
   <body>
      <span>Hello world!!!</span>
      <div class = 'links'>
         <a href = 'one.html'>Link 1<img src = 'image1.jpg'/></a>
         <a href = 'two.html'>Link 2<img src = 'image2.jpg'/></a>
         <a href = 'three.html'>Link 3<img src = 'image3.jpg'/></a>
      </div>
   </body>
</html>

Construir selectores

Puede construir las instancias de la clase de selector pasando el text o TextResponseobjeto. Según el tipo de entrada proporcionado, el selector elige las siguientes reglas:

from scrapy.selector import Selector 
from scrapy.http import HtmlResponse

Usando el código anterior, puede construir a partir del texto como:

Selector(text = body).xpath('//span/text()').extract()

Mostrará el resultado como -

[u'Hello world!!!']

Puede construir a partir de la respuesta como:

response = HtmlResponse(url = 'http://mysite.com', body = body) 
Selector(response = response).xpath('//span/text()').extract()

Mostrará el resultado como -

[u'Hello world!!!']

Usando selectores

Usando el fragmento de código simple anterior, puede construir el XPath para seleccionar el texto que se define en la etiqueta del título como se muestra a continuación:

>>response.selector.xpath('//title/text()')

Ahora, puede extraer los datos textuales usando el .extract() método que se muestra a continuación:

>>response.xpath('//title/text()').extract()

Producirá el resultado como:

[u'My Website']

Puede mostrar el nombre de todos los elementos que se muestran a continuación:

>>response.xpath('//div[@class = "links"]/a/text()').extract()

Mostrará los elementos como:

Link 1
Link 2
Link 3

Si desea extraer el primer elemento, utilice el método .extract_first(), se muestra de la siguiente manera:

>>response.xpath('//div[@class = "links"]/a/text()').extract_first()

Mostrará el elemento como -

Link 1

Selectores de anidamiento

Usando el código anterior, puede anidar los selectores para mostrar el enlace de la página y la fuente de la imagen usando el .xpath() método, que se muestra a continuación:

links = response.xpath('//a[contains(@href, "image")]') 

for index, link in enumerate(links): 
   args = (index, link.xpath('@href').extract(), link.xpath('img/@src').extract()) 
   print 'The link %d pointing to url %s and image %s' % args

Mostrará el resultado como -

Link 1 pointing to url [u'one.html'] and image [u'image1.jpg']
Link 2 pointing to url [u'two.html'] and image [u'image2.jpg']
Link 3 pointing to url [u'three.html'] and image [u'image3.jpg']

Selectores que utilizan expresiones regulares

Scrapy permite extraer los datos mediante expresiones regulares, que utiliza la .re()método. Del código HTML anterior, extraeremos los nombres de las imágenes que se muestran a continuación:

>>response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')

La línea anterior muestra los nombres de las imágenes como:

[u'Link 1', 
u'Link 2', 
u'Link 3']

Uso de XPath relativos

Cuando trabaja con XPaths, que comienza con el /, los selectores anidados y XPath están relacionados con la ruta absoluta del documento y no con la ruta relativa del selector.

Si desea extraer el <p> elementos, luego primero obtenga todos los elementos div -

>>mydiv = response.xpath('//div')

A continuación, puede extraer todos los 'p' elementos en el interior, prefijando el XPath con un punto como .//p como se muestra a continuación -

>>for p in mydiv.xpath('.//p').extract()

Uso de extensiones EXSLT

EXSLT es una comunidad que emite las extensiones de XSLT (Transformaciones de lenguaje de hoja de estilo extensible) que convierte documentos XML en documentos XHTML. Puede utilizar las extensiones EXSLT con el espacio de nombres registrado en las expresiones XPath como se muestra en la siguiente tabla:

No Señor Prefijo y uso Espacio de nombres
1

re

expresiones regulares

http://exslt.org/regexp/index.html

2

set

establecer manipulación

http://exslt.org/set/index.html

Puede verificar el formato de código simple para extraer datos usando expresiones regulares en la sección anterior.

Hay algunos consejos de XPath, que son útiles cuando se usa XPath con selectores Scrapy. Para obtener más información, haga clic en este enlace .