Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte00:00:00 :Dans cette partie, c'est à vous de jouer. Je souhaite que vous récupériez le titre de tousles livres qui sont sur la page d'accueil de notre site books2script.com. Alors vous pouvez partir du
00:00:09 :fichier index.html que je vais mettre dans les sources et utiliser donc with open comme ça pourlire le contenu de ce fichier si vous souhaitez avoir exactement la même chose que moi. Normalement
00:00:20 :le site ne change pas beaucoup mais comme ça vous êtes absolument sûr d'avoir exactement la mêmechose que ce que je vais faire dans cette partie dans la correction. Sinon vous pouvez donc utiliser
00:00:28 :l'url pour aller chercher le html au moment où vous faites l'exercice. Il se peut que si le sitea changé entre le moment où j'enregistre cette formation et le moment où vous faites l'exercice,vous ayez quelque chose d'un petit peu différent. Donc à vous de voir quelle version vous préférez.
00:00:43 :Moi je vais partir avec le index.html et donc l'objectif c'est de récupérer le titre complet.Donc j'insiste sur complet puisque vous voyez par exemple ici sur le premier nom on a des pointsde suspension puisqu'il y a des titres qui sont assez longs et qui sont donc tronqués dans la
00:00:57 :page d'accueil. Donc à vous de voir comment vous pouvez récupérer le titre complet, analyser lehtml, vérifier où est le meilleur endroit pour récupérer le titre complet que ce soit sur lesbalises dans les attributs. Je vous laisse regarder ça et nous on se retrouve tout de suite pour la
00:01:12 :correction. Alors la première chose à faire comme d'habitude c'est d'aller analyser notre html. Doncon voit que pour chaque livre on a une balise article ici qui va contenir l'image, le ratingdonc le nombre d'étoiles sur 5. Là on voit qu'on a trois étoiles par exemple et on va ensuite avoir
00:01:27 :une balise h3 avec le titre qui va être contenu dans un lien pour qu'on puisse cliquer dessus,on a ensuite le prix et d'autres informations par exemple le stock. Et on va avoir un article
00:01:37 :comme ça pour chaque livre sur la page. Donc la première chose à faire c'est essayer de trouveroù à l'intérieur de cette balise article on va pouvoir retrouver le titre. Comme je vous l'avais
00:01:46 :dit si on regarde le titre on va voir que ici dans le texte on a des points de suspension donc on n'apas le titre au complet mais on va trouver le titre au complet à différents endroits notammentjuste avant donc dans cette balise A qui est un lien on va avoir un attribut title qui lui
00:02:01 :contient le titre au complet. Vous avez probablement remarqué également que sur l'image dans le alt ona le titre également. Moi je vais faire un petit peu moins confiance à ce alt puisque des fois il
00:02:11 :n'est pas présent ou alors on pourrait avoir quelqu'un qui va mettre quelque chose de différent.Là moi j'ai plus confiance dans l'attribut title ici qui est assez explicite et qui contient lenom complet de notre livre. Donc moi je vais passer par ça je vais retourner dans mon fichier
00:02:25 :main.py ici et là comme d'habitude avec la programmation et encore plus avec le scrappingici il y a plein de façons de faire. Donc moi je vais vous montrer différentes façons je vais vous
00:02:34 :montrer une première façon qui est probablement une façon plus proche de ce que vous avez faitet on va voir dans la suite une façon un peu plus avancée avec une technique qu'on n'a pas encorevu qui va permettre de cibler des éléments sur la page en fonction d'un attribut spécifique qu'ils
00:02:49 :ont. Donc dans ce cas ci ça nous permettra de récupérer les liens qui contiennent un title doncun attribut title et uniquement cela. Donc je vais commencer par la première façon de faire qui va
00:02:58 :être de cibler toutes les balises articles qui contiennent la classe product. Donc si on remonteici on a tous les articles ici avec cette classe. On va les cibler et à l'intérieur de ça on va
00:03:08 :chercher les balises A et on va récupérer la balise qui contient le titre pour récupérer l'attributqui contient donc le titre du livre. Donc ce que je vais faire ici c'est récupérer déjà tous les
00:03:18 :articles donc on va faire une variable article et on va faire souple.findall. On va cibler lesbalises articles et on va cibler la classe product pod comme ceci et ensuite on va boucler donc surces articles. Donc je veux dire pour article sans s in articles donc articles ici avec un s, on va
00:03:35 :récupérer tous les liens. Donc je vais faire une variable links et on va faire article.findallet on va chercher le lien. Je pourrais faire un find mais le find ça va récupérer uniquement le
00:03:45 :premier lien et dans ce cas-ci le premier lien c'est ici le lien qui contient l'image. Donc moice que je veux c'est le deuxième donc ce que je vais faire c'est je vais faire un findall et làdifférentes façons de faire. On peut faire les crochets et mettre "-1", puisqu'on considère
00:03:58 :qu'on a une liste avec deux liens et que le titre est le deuxième lien. Donc on pourrait mettrel'indice 1 pour récupérer explicitement le deuxième lien puisqu'on commence à compter à partir de 0vous le savez en programmation. Donc là différentes façons de faire. Je prends le dernier en sachant
00:04:13 :qu'on n'a que deux liens et que le deuxième lien qui est le dernier est le titre ou alors je ciblespécifiquement le deuxième lien. Donc là si je fais cette récupération directement ici je peux
00:04:22 :enlever le s. Là c'est à vous de voir le niveau de gestion d'erreur que vous souhaitez faire. Jepourrais mettre un links comme ça et faire une vérification en faisant un if len de links estsupérieur ou égal à 2. Et bien là ce qu'on va faire c'est qu'on va récupérer le link et on
00:04:37 :va dire que links est égal à crochet 1 et ensuite on peut afficher sur ce link l'attribut title. Doncfaire un print de link.getTitle. Donc là j'utilise get au cas où on n'est pas cet attribut pour ne
00:04:48 :pas avoir d'erreur. Donc là si je lance le script normalement on devrait récupérer les titres detous les livres donc on les a bien ici avec les titres au complet qui ne sont pas tronqués. Donc
00:04:57 :ça c'est une première façon de faire comme je vous dis on peut simplifier ça en fonction duniveau de gestion d'erreur que vous souhaitez avoir. Là avec cette façon de faire avec la
00:05:04 :structure conditionnelle je suis sûr que ici ça ne va pas planter puisque on aura forcément au moinsdeux éléments dans notre liste donc on va pouvoir récupérer le deuxième élément. Et ensuite avec
00:05:14 :le get je m'assure que même si on n'a pas d'attribut title on n'aura pas d'erreur dans notre script eton aura juste none qui va nous être retourné. Donc après à vous de gérer ça si vous souhaitez
00:05:22 :ajouter tout ça dans une liste pour vérifier si on a un élément qui est retourné dans ce link.getTitleet si on n'a pas d'élément donc si on a un none de ne pas l'ajouter dans votre liste. Donc ça c'est
00:05:32 :la première façon de faire qui nécessite pas mal de lignes de code ici. Et la deuxième façon defaire que moi je préfère qui va tenir en deux lignes de code c'est d'utiliser une façon de fairequ'on n'a pas encore vu donc ne vous inquiétez pas si vous n'avez pas fait ça. Donc je vais faire
00:05:45 :une variable que je vais appeler titleTags et on va faire un soup.findAll de tous les liens surnotre page. Et là le problème c'est qu'on va récupérer les liens également de l'image et on
00:05:55 :pourra avoir d'autres liens sur la page puisque si on remonte ici si vous vous souvenez bien on ades liens également pour les catégories, on va avoir le lien sur la barre de navigation du siteégalement. Donc là ça va nous poser problème mais on peut spécifier qu'on souhaite récupérer
00:06:09 :uniquement les liens qui contiennent un attribut title. Donc là encore à vous d'analyser le htmlpour vous assurer qu'il n'y a pas de title sur d'autres liens du site. On pourrait très bien
00:06:18 :imaginer qu'ici on ait un title qui corresponde au nom de la catégorie sur ces catégories donclà si on avait ça ça ne marcherait pas. Moi j'ai analysé le html et j'ai remarqué qu'on avait cet
00:06:28 :attribut title uniquement sur les liens qui correspondent au titre de chaque livre. Donc çane pose pas de problème et ce qu'on peut faire pour spécifier qu'on souhaite récupérer uniquementles balises de liens qui contiennent un attribut title, c'est rajouter un paramètre ici en disanttitle égale à true. Donc là on envoie en argument true à title, on peut le mettre directement ici
00:06:47 :avec une virgule après le nom de la balise et on pourrait même spécifier une valeur spécifique sion souhaitait par exemple récupérer uniquement les balises A qui contiennent le title qui estégal à a light in the attic. On pourrait mettre ici une chaîne de caractères et si je lance le
00:07:02 :script là vous allez voir qu'on va récupérer uniquement donc là si je fais un print bien sûrsi je fais un print vous allez voir qu'on va récupérer uniquement ce lien qui contient a lightin the attic. Ce qu'on peut faire c'est donc à la place de mettre une valeur précise mettre true et
00:07:14 :là ce qu'on va faire c'est récupérer uniquement les balises A qui contiennent un attribut titlequi contient quelque chose. Donc là si je relance on retrouve bien ici tous nos liens avec à chaque
00:07:24 :fois un title. Pour récupérer ensuite les valeurs de ce title je peux faire là encore une compréhensionde liste donc je vais dire A et je vais mettre entre crochet title donc là je ne suis pas obligéde mettre un get je peux le faire s'il souhaite éviter les erreurs mais là comme on dit qu'on
00:07:38 :souhaite explicitement récupérer uniquement les balises qui contiennent un attribut title on nedevrait avoir aucun problème ici puisqu'on aura forcément un attribut title sur ces éléments.
00:07:48 :Donc là je vais dire A title for A in title tags et ainsi on va pouvoir récupérer directement lavaleur de l'attribut title. Si je refais un pprint de titles ici cette fois-ci on se retrouve bien
00:08:00 :avec directement la valeur en chaîne de caractère de l'attribut title sur tous les liens de notrepage qui contiennent un attribut title. Donc vous voyez comme ça c'est très rapide avec juste ces
00:08:10 :deux lignes de code ici on peut récupérer les titres de tous les livres sur la page. Si onvoulait encore plus réduire ce code on pourrait mettre directement le soup.findall ici et se
00:08:20 :retrouver avec une seule ligne qui nous permet de tout récupérer. Et là on a une bonne gestion deserreurs également puisqu'on va cibler spécifiquement les éléments qui ont title égaleà true. Donc si jamais par la suite on modifiait le html pour enlever cet attribut title et bien
00:08:34 :on se retrouverait tout simplement ici avec une liste vide et on ferait une compréhension deliste sur une liste vide et donc on aurait tout simplement une liste vide à la fin. Donc on n'aurait
00:08:43 :tout simplement pas d'erreurs, on n'aurait bien sûr pas les titres mais là il suffirait de changervotre script pour vous adapter aux changements qui ont été faits sur le site. Mais voilà avec cette
00:08:50 :solution vous avez tous les titres en une seule ligne de code. Bien sûr je le répète il y a pleinde façons de réaliser cet exercice. Vous pouvez partir d'un peu près n'importe où sur la page,
00:08:59 :vous pouvez faire des parents, des children, vous pouvez récupérer à partir du body et descendreà partir d'autres éléments comme on l'a vu dans la première façon de faire. Là moi je trouve que
00:09:08 :cette façon de faire ici avec le ciblage directement sur le title c'est la façon laplus précise. Comme je l'avais dit on pouvait aussi partir sur les images. De ce que j'ai vu
00:09:16 :les titres sont exactement les mêmes dans le alt de l'image. Si vous voulez vous entraîner pourpratiquer avec cette façon de faire, je vous conseille d'essayer à la place d'utiliser lesliens de cibler les images pour récupérer l'attribut alt et ainsi la valeur du titre en partant desimages de la page.
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.