La bibliothèque Scrapy est une bibliothèque de grattage Web très puissante, facile à utiliser également. Si vous êtes nouveau dans ce domaine, vous pouvez suivre le tutoriel disponible sur l'utilisation de la bibliothèque de scroty.
Ce tutoriel couvre l'utilisation des sélecteurs XPath. XPath utilise un chemin comme la syntaxe pour naviguer dans les nœuds des documents XML. Ils sont également utiles pour naviguer dans les balises HTML.
Contrairement au tutoriel de scracy, nous allons faire toutes nos opérations ici sur le terminal pour la simplicité. Cela ne signifie pas que le XPATH ne peut pas être utilisé avec le programme de scracy approprié, ils peuvent être utilisés dans la bibliothèque d'analyse sur le paramètre de réponse.
Nous allons travailler avec l'exemple.webscraping.site com, car il est très simple et aiderait à comprendre les concepts.
Pour utiliser Scrapy dans notre terminal, saisissez la commande ci-dessous:
$ SCrapy Shell http: // Exemple.webscraping.com
Il visiterait le site et obtiendrait les informations nécessaires, puis nous laisser avec une coquille interactive pour travailler avec. Vous devriez voir une invite comme:
En 1]:
De la session interactive, nous allons travailler avec le réponse objet.
Voici à quoi ressemblerait notre syntaxe pour la majorité de cet article:
Dans [1]: réponse.xpath ('xpathSyntax').extrait()
Cette commande ci-dessus est utilisée pour extraire toutes les balises correspondantes en fonction de la syntaxe XPATH, puis la stocke dans une liste.
Dans [2]: réponse.xpath ('xpathSyntax').extract_first ()
Cette commande ci-dessus est utilisée pour extraire uniquement la première balise correspondante et la stocke dans une liste.
Nous pouvons maintenant commencer à travailler sur la syntaxe XPATH.
Navigation de balises
Navigation de balises dans xpath est très facile, tout ce qui est nécessaire est le «/» de slash vers l'avant suivi du nom de la balise.
Dans [3]: réponse.xpath ('/ html').extrait()
La commande ci-dessus renvoie le html Tag et tout ce qu'il contient en tant qu'élément unique dans une liste.
Si nous voulons obtenir le corps de la page Web, nous utiliserions ce qui suit:
Dans [4]: réponse.xpath ('/ html / body').extrait()
XPath permet également au personnage de joker «*», qui correspond à tout dans le niveau dans lequel il est utilisé.
Dans [5]: réponse.xpath ('/ *').extrait()
Le code ci-dessus correspondrait à tout dans le document. La même chose se produit lorsque nous utilisons «/ html».
Dans [6]: réponse.xpath ('/ html / *').extrait()
En tant que navigation de balises, nous pouvons obtenir toutes les balises descendantes d'une balise particulière en utilisant le «//».
Dans [7]: réponse.xpath ('/ html // a').extrait()
Le code ci-dessus renverrait toutes les balises d'ancrage sous la balise HTML I.e. Il rendrait une liste de toutes les balises d'ancrage descendant.
Tags par attributs et leurs valeurs
Parfois, naviguer dans des balises HTML pour accéder à la balise requise pourrait être un problème. Ce problème peut être évité en trouvant simplement la balise nécessaire par son attribut.
Dans [8]: réponse.xpath ('/ html // div [@id = "pagination"]').extrait()
Le code ci-dessus renvoie tout le div Tags sous le html Tag qui a le identifiant attribut avec une valeur de pagination.
Dans [9]: réponse.xpath ('/ html // div [@class = "span12"]').extrait()
Le code ci-dessus renvoie une liste de tous les div Tags sous la balise HTML, seulement s'ils ont l'attribut de classe avec une valeur de Span12.
Et si vous ne connaissez pas la valeur de l'attribut? Et tout ce que vous voulez, c'est obtenir des balises avec un attribut particulier, sans aucune préoccupation quant à sa valeur. Faire cela est également simple, tout ce que vous avez à faire est d'utiliser uniquement le symbole @ et l'attribut.
Dans [10]: réponse.xpath ('/ html // div [@class]').extrait()
Ce code renverrait une liste de toutes les balises div contenant l'attribut de classe quelle que soit la valeur de cet attribut de classe.
Que diriez-vous si vous ne savez que quelques caractères contenus dans la valeur d'un attribut? Il est également possible d'obtenir ce type de balises.
Dans [11]: réponse.xpath ('/ html // div [contient (@id, "ion")]').extrait()
Le code ci-dessus renvoie toutes les balises DIV sous la balise HTML qui ont l'attribut ID, mais nous ne savons pas quelle valeur l'attribut détient, sauf que nous savons qu'il contient «ion».
La page que nous analysons n'a qu'une seule balise dans cette catégorie, et la valeur est la «pagination», donc il serait retourné.
Cool à droite?
Tags par leur texte
N'oubliez pas que nous avons apparié les balises par leurs attributs plus tôt. Nous pouvons également faire correspondre les balises par leur texte.
Dans [12]: réponse.xpath ('/ html // a [.= "Algérie"] ').extrait()
Le code ci-dessus nous aiderait à obtenir toutes les balises d'ancrage qui ont le texte «Algérie» en eux. NB: Ce doit être des balises avec exactement ce contenu texte.
Merveilleux.
Que diriez-vous si nous ne savons pas dans le contenu texte exact, et nous ne connaissons que quelques-uns du contenu texte? Nous pouvons aussi faire ça.
Dans [13]: réponse.xpath ('/ html // a [contient (text (), "a")]').extrait()
Le code ci-dessus obtiendrait les balises qui ont la lettre «A» dans leur contenu texte.
Extraction du contenu de la balise
Tout au long, nous avons parlé de trouver les bonnes étiquettes. Il est temps d'extraire le contenu de la balise lorsque nous le trouvons.
C'est assez simple. Tout ce que nous devons faire est d'ajouter «/ text ()» à la syntaxe, et le contenu de la balise serait extrait.
Dans [14]: réponse.xpath ('/ html // a / text ()').extrait()
Le code ci-dessus obtiendrait toutes les balises d'ancrage dans le document HTML, puis extraire le contenu texte.
Extraction des liens
Maintenant que nous savons extraire le texte dans des balises, alors nous devons savoir extraire les valeurs des attributs. La plupart du temps, les valeurs des attributs qui sont de la plus haute importance pour nous sont des liens.
Cela est presque le même que d'extraire les valeurs de texte, mais au lieu d'utiliser "/ text ()", nous utiliserions le symbole "/ @ @" et le nom de l'attribut.
Dans [15]: réponse.xpath ('/ html // a / @ href').extrait()
Le code ci-dessus extrait tous les liens dans les balises d'ancrage, les liens sont censés être les valeurs du href attribut.
Navigation de tags de frères
Si vous l'avez remarqué, nous avons navigué des balises tout cela pendant. Cependant, il y a une situation que nous n'avons pas abordée.
Comment sélectionner une balise particulière lorsque les balises avec le même nom sont au même niveau?
Afghanistan
Iles AlandDans un cas comme celui que nous avons ci-dessus, si nous voulons le regarder, nous pourrions dire que nous utiliserions extract_first () Pour obtenir le premier match.
Cependant, et si nous voulons correspondre au second? Et s'il y a plus de dix options et que nous voulons le cinquième? Nous allons répondre à ça maintenant.
Voici la solution: lorsque nous écrivons notre syntaxe XPATH, nous mettons la position de la balise que nous voulons entre crochets, tout comme nous indexons mais l'index commence à 1.
En regardant le HTML de la page Web avec laquelle nous avons affaire, vous remarqueriez qu'il y a beaucoup de
Tags au même niveau. Pour obtenir le troisième Tag, nous utiliserions le code suivant: Dans [16]: réponse.xpath ('/ html // tr [3]').extrait()Vous remarqueriez également que le
Les balises sont en deux, si nous ne voulons que le second Tags du lignes que nous ferions ce qui suit: Dans [17]: réponse.xpath ('/ html // td [2]').extrait()CONCLUSION:
XPath est un moyen très puissant pour analyser les fichiers HTML et pourrait aider à minimiser l'utilisation des expressions régulières pour les analyser étant donné qu'il a le contient fonction dans sa syntaxe.
Il existe d'autres bibliothèques qui permettent l'analyse de XPATH comme le sélénium pour l'automatisation Web. Xpath nous donne beaucoup d'options tout en analysant le HTML, mais ce qui a été traité dans cet article devrait être en mesure de vous transporter à travers des opérations d'analyse HTML communes.