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 |
|
2 | set manipulation d'ensemble |
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 .