Scrapy - Sélecteurs

La description

Lorsque vous grattez les pages Web, vous devez extraire une certaine partie de la source HTML en utilisant le mécanisme appelé selectors, réalisé en utilisant des expressions XPath ou CSS. Les sélecteurs sont basés surlxml bibliothèque, qui traite le XML et le HTML en langage Python.

Utilisez l'extrait de code suivant pour définir différents concepts de sélecteurs -

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

Construire des sélecteurs

Vous pouvez construire les instances de classe de sélecteur en passant le text ou TextResponseobjet. En fonction du type d'entrée fourni, le sélecteur choisit les règles suivantes -

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

En utilisant le code ci-dessus, vous pouvez construire à partir du texte comme -

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

Il affichera le résultat comme -

[u'Hello world!!!']

Vous pouvez construire à partir de la réponse comme -

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

Il affichera le résultat comme -

[u'Hello world!!!']

Utilisation des sélecteurs

En utilisant l'extrait de code simple ci-dessus, vous pouvez construire le XPath pour sélectionner le texte qui est défini dans la balise de titre comme indiqué ci-dessous -

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

Maintenant, vous pouvez extraire les données textuelles en utilisant le .extract() méthode montrée comme suit -

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

Il produira le résultat comme -

[u'My Website']

Vous pouvez afficher le nom de tous les éléments indiqués comme suit -

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

Il affichera les éléments comme -

Link 1
Link 2
Link 3

Si vous souhaitez extraire le premier élément, utilisez la méthode .extract_first(), illustré comme suit -

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

Il affichera l'élément comme -

Link 1

Sélecteurs d'imbrication

À l'aide du code ci-dessus, vous pouvez imbriquer les sélecteurs pour afficher le lien de la page et la source de l'image à l'aide du .xpath() méthode, illustrée comme suit -

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

Il affichera le résultat comme -

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']

Sélecteurs utilisant des expressions régulières

Scrapy permet d'extraire les données à l'aide d'expressions régulières, qui utilise le .re()méthode. À partir du code HTML ci-dessus, nous allons extraire les noms d'images comme suit -

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

La ligne ci-dessus affiche les noms des images sous la forme -

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

Utilisation des XPaths relatifs

Lorsque vous travaillez avec XPaths, qui commence par le /, les sélecteurs imbriqués et XPath sont liés au chemin absolu du document et non au chemin relatif du sélecteur.

Si vous souhaitez extraire le <p> éléments, puis gagnez d'abord tous les éléments div -

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

Ensuite, vous pouvez extraire tous les 'p' éléments à l'intérieur, en préfixant le XPath avec un point comme .//p comme indiqué ci-dessous -

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

Utilisation des extensions EXSLT

L'EXSLT est une communauté qui émet les extensions du XSLT (Extensible Stylesheet Language Transformations) qui convertit les documents XML en documents XHTML. Vous pouvez utiliser les extensions EXSLT avec l'espace de noms enregistré dans les expressions XPath comme indiqué dans le tableau suivant -

Sr. Non Préfixe et utilisation Espace de noms
1

re

expressions régulières

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

2

set

manipulation d'ensemble

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

Vous pouvez vérifier le format de code simple pour extraire des données à l'aide d'expressions régulières dans la section précédente.

Il existe quelques astuces XPath, utiles lors de l'utilisation de XPath avec des sélecteurs Scrapy. Pour plus d'informations, cliquez sur ce lien .