Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte00:00:00 :Dans cette partie, on va voir un peu plus précisément comment on peut récupérer desinformations avec Beautiful Soup et naviguer à l'intérieur de la structure HTML de notre page.
00:00:10 :Donc dans ce cas-ci, toujours le site books.toscrape.com qui contient différents livresqui contiennent des informations comme le prix, les nombres des toiles, etc.Donc la première chose que vous allez remarquer très certainement quand vousfaites un Soup. c'est qu'on a beaucoup beaucoup de fonctions ici et notamment on
00:00:29 :a quelque chose d'assez bizarre, c'est-à-dire qu'on a deux nomenclatures. Donc on a unenomenclature en lowercase comme ça, donc par exemple si je prends la méthode findAll,vous voyez qu'on a find tiré du bas All, mais on a aussi findAll comme ça avec unemajuscule sur chaque mot, donc le SnakeCase ou PascalCase si mes souvenirs sont bons.
00:00:45 :Donc vous vous demandez probablement pourquoi on a ces deux nomenclatures,est-ce qu'il y a une différence entre les deux ? Donc pas du tout, moi je vous conseille d'utiliser
00:00:53 :cette façon de faire qui est la nouvelle façon de faire, qui suit les recommandations de laPEP8 pour Python avec les noms des méthodes qui sont comme ça en lowercase. Donc la seule
00:01:03 :raison pour laquelle on a encore accès au findAll comme ça avec une majuscule et non pas les tirésdu bas, c'est tout simplement pour des raisons de rétrocompatibilité avec les précédentesversions de Beautiful Soup. Donc c'est sûr que ça fait un petit peu fouillis, à chaque fois que
00:01:16 :vous tapez find comme ça ici, vous allez voir qu'il y a beaucoup de choses comme ça avec àchaque fois des doublons, donc faut pas vous en faire, moi je vous conseille vraiment tout letemps de faire find tiré du bas pour comme ça filtrer et avoir automatiquement toutes les
00:01:28 :versions avec le lowercase qui sont directement visibles. Donc une fois qu'on a dit ça, maintenantqu'est ce qu'on peut faire avec ces différentes méthodes ? Vous allez voir qu'on a pas mal de
00:01:37 :méthodes mais il y en a qu'on utilise un peu plus que d'autres, notamment find et findAll. Donc ladifférence entre les deux c'est que find va nous retourner un seul élément, donc imaginez qu'onait plusieurs paragraphes sur la page, si je fais findP comme ça, il va nous retourner uniquement
00:01:50 :le premier paragraphe qu'il va trouver sur la page. Donc si je fais un findDeBody par exemple,dans ce cas-ci ça va nous retourner le body et il n'y en a qu'un, donc ce n'est pas un problème. Je
00:02:00 :peux utiliser find comme ça et si je fais un printDuBody, vous allez voir qu'on a finalementtoute la page qui est affichée. Comme je vous ai dit, à chaque fois qu'on va récupérer quelque
00:02:08 :chose sur la page, on peut faire un prettify sur tous ces éléments, donc sur tous ces nœuds duhtml, à chaque fois on a ce prettify qui est disponible qui va nous permettre de mettre enforme les données qui nous sont retournées avec les tabulations, les retours à la ligne, etc.
00:02:21 :Là on a récupéré le body, si on fait un findAll dans ce cas-ci avec le body, vous allez voir queça ne change pas grand chose, sauf que plutôt que d'avoir directement tout le texte, on va avoirune liste. Et quand je dis tout le texte, même si là ça nous affiche du texte, il faut bien
00:02:36 :comprendre que comme on l'a vu, c'est des objets, donc c'est des objets avec des attributs. On peutles retourner si on les convertit en chaînes de caractère avec string sous forme de texte. Donc là,
00:02:45 :dans ce cas-ci, ça ne fonctionnera pas avec le findAll ou plutôt ça nous retournera la listeen forme de texte, puisque là vous avez vu à la fin on a un crochet. Pourquoi ? Eh bien parce que
00:02:53 :findAll va toujours nous retourner une liste, même si on n'a qu'un seul élément. Donc là,si je fais un printType de body, vous allez voir ici qu'on a un resultSet, donc c'est unélément BeautifulSoup. Même si ça ressemble à une liste, ce n'est pas 100% une liste. Bien sûr,
00:03:06 :ça ressemble à une liste, mais c'est un objet BeautifulSoup qui est dans ce cas-ci un resultSet,qui contient donc différents éléments. Si je fais un find, par contre, juste sur le body,
00:03:16 :on va relancer pour afficher le type, là vous voyez qu'on a un élément tag. Donc on a justele tag body, donc juste la balise body. Et quand on fait avec le findAll, on va se retrouver avec
00:03:25 :plusieurs éléments. Donc avec le body, ça n'a pas trop d'intérêt, mais si par exemple je faisun findAll sur les images, là on va pouvoir récupérer toutes les images de notre site.
00:03:34 :Donc je vais changer le nom ici pour que ce soit un peu plus explicite. On va mettre images,je relance et là vous allez voir qu'on a une liste avec toutes les images de notre page web.
00:03:41 :Si vous voulez les afficher un petit peu mieux avec un print, on peut utiliser la fonctionpprint du module pprint, donc from pprint import pprint comme ceci avec deux p, et ça va vousafficher la liste d'une façon un peu plus claire. Et là on voit bien qu'on a donc toutes les images
00:03:55 :qui sont retournées, donc toutes les images de notre page web. Donc ça c'est très pratique,c'est le premier qu'on voit revenir le plus souvent pour récupérer par exemple toutes les balises p,toutes les balises h3, on peut récupérer tous les éléments comme ça de notre page avec le findAll.
00:04:10 :Et on peut aller plus loin en filtrant sur certains attributs, notamment un attribut bienpratique qui est l'attribut classe. Donc dans ce cas-ci on va mettre un tiré du bas, puisque là si
00:04:19 :j'enlève le tiré du bas vous voyez qu'on a une coloration syntaxique qui nous indique bien qu'onest avec le mot clé réservé par python class qui permet de créer des classes. Donc pour ne pas avoir
00:04:28 :un clash entre les noms, ils ont décidé de rajouter ici un tiré du bas, et ça nous permet ici depréciser une classe. Donc si on va voir sur le site par exemple, si je vais voir ici en faisant un
00:04:38 :clic droit inspect, on va voir qu'on a ici une balise articles avec une classe ProductPod,donc je vais grossir un petit peu pour qu'on voit bien ici. Donc ProductPod, je peux utiliser ce
00:04:50 :nom de cette classe pour filtrer tous les articles. Donc là je crois que les articles c'est uniquementpour les livres ici et qu'il n'y a pas d'autres articles, mais imaginez qu'on ait des articles quin'est pas cette classe, et bien il ne serait pas récupéré si je le mets ici. Donc là je vais
00:05:03 :prendre la balise articles et on va dire qu'on veut filtrer uniquement les articles, donc lesbalises articles qui ont comme classe ProductPod. Donc je garde le find all, on va garder le nom
00:05:12 :image ici, je relance et là on va bien avoir tous les articles de notre page. Donc là c'est un petitpeu fouillis ici, mais on voit bien qu'on retrouve les h3 avec les icônes pour les étoiles, l'imagequelque part, image container et l'article ici avec la classe ProductPod. Donc vous voyez qu'il
00:05:29 :y a beaucoup d'options comme ça, on ne va pas toutes les voir dans cette partie, il y a beaucoupde choses qu'on va voir par la suite avec des cas un peu plus concrets, mais vous voyez que trèsfacilement avec quelques lignes de code ici, on peut récupérer des éléments très précis de notre
00:05:41 :page. Et comme on l'a vu également, on peut naviguer à l'intérieur de cette structure. Doncpar exemple ici sur mon site, on va avoir une barre sur le côté avec un aside, donc je peux cibler ceaside avec un find, donc on va dire aside égale soup.find et on va dire qu'on veut récupérer le
00:05:58 :aside, et ensuite je peux par exemple afficher tous les children. Donc si je fais un aside.children,vous allez voir qu'on a un truc qui n'est pas très digeste, on va avoir tout simplement un listitérateur, donc c'est un itérateur. Un itérateur, il va falloir boucler dessus pour pouvoir afficher
00:06:11 :les différents éléments et les récupérer. Donc je vais dire pour child in aside.children et on vaafficher child.name. Je relance le script et là vous voyez que comme je vous avais dit, des fois
00:06:22 :on a des none. Donc les none, qu'est-ce que c'est ? C'est tout simplement quand on a des retours àla ligne par exemple ou des tabulations. Donc là si on prend notre aside, on voit que dans les
00:06:30 :children, on a bien le premier div ici avec les promotions left et le deuxième div qui est lescatégories. Et entre les deux, on a des none qui correspondent à des éléments donc qui n'ont pas
00:06:40 :de balise définie qui sont par exemple des retours à la ligne ou des tabulations. Donc dans ce casci, on a bien les deux divs. Si on ne veut pas afficher ces éléments en none, on peut dire tout
00:06:48 :simplement if child.name et si donc c'est égal à none ici, on ne va pas rentrer dans cette structureconditionnelle. Je refais un print de child.name et là on aura bien uniquement les deux divs. Et
00:06:59 :on peut continuer comme ça, on peut y aller de plus en plus, on peut refaire des find à l'intérieurde tout ça également. Donc imaginons que je souhaite récupérer le div qui contient la
00:07:08 :classe sideCategory à l'intérieur de mon aside, et bien je peux faire un nouveau find dessus. Doncje vais dire sideCategories égale aside.find et là on va dire qu'on souhaite chercher le div avec
00:07:20 :la classe qui est égale à sideCategories. Et là si je fais un print de sideCategories, vous allezvoir qu'on retrouve bien la liste de toutes les catégories qui sont sur la barre de navigation surle côté. Donc on retrouve bien notre div ici, avec la liste, donc unordered list ici, avec les
00:07:36 :books et toutes les catégories, travel, mystery, etc. Et vous voyez qu'on peut donc continuer commeça avec des find ou des find all. Donc dans ce cas ci, probablement ici que je vais vouloir récupérer
00:07:46 :les A par exemple. Donc là je pourrais par exemple faire une variable length et faire sideCategories.findall cette fois ci, et cibler toutes les balises A et afficher tous les links ici. Donc je vais faire
00:07:57 :un pprint pour que la liste affiche un petit peu mieux. Et là on voit qu'on récupère bien lesliens de toutes les catégories dans la barre de navigation. Donc vous voyez comme ça, ça permet
00:08:07 :de cibler des choses très spécifiques, plutôt que de récupérer tous les liens sur la page, puisque làsi on tourne sur la page, on a des liens un petit peu partout. On a le lien ici, on a le lien pour
00:08:15 :home, ensuite on a le lien de tous les livres ici, le lien pour ajouter au panier. Donc nous par exemplesi on veut uniquement les liens de cette barre de catégories, et bien on peut aller cibler ceaside ici, donc cette balise aside, et ensuite naviguer à l'intérieur de tout ça avec des
00:08:29 :find ou avec des children. Vous allez voir si vous explorez un petit peu tout ça, qu'on a pasmal d'autres choses qui sont disponibles. Par exemple on peut faire find next sibling, on peut
00:08:37 :récupérer également le parent. Donc si je fais un print de aside.parent et que je continue comme ça,et bien à un moment je vais me retrouver sur le body. Là je continue et vous voyez que si je
00:08:47 :remonte tout en haut, on va probablement arriver pas loin du body. Donc là je reviens, on est surle container fluide, et je peux continuer comme ça. Et c'est comme ça qu'avec par exemple des
00:08:55 :boucles while, on peut remonter dans un sens ou dans l'autre pour par exemple récupérer le parentou les enfants, tant qu'on a un parent qui est disponible, ou tant qu'on a un enfant qui estdisponible. Donc on a vraiment ici toutes les notions de récursivité, si vous souhaitez naviguer comme ça,
Ce n'est pas fini...
✋
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.