Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un comptelive_helpToutes les questions

Cyprien
26 septembre 2024
Résolue
2 réponses
Erreur dans le code de récupération des titres de produits
Bonjour,
j'ai fais comme ça, c'est une erreur ?
```python
produits = soup.find_all("article", class_="product_pod")
for produit in produits:
titre = produit.find("h3").find("a")["title"]
print(titre)
```
00:00:00 :Dans cette partie on va récupérer des informations spécifiques sur la page donc on va le faireensemble dans cette partie et par la suite je vais vous laisser tester par vous même pourchercher d'autres informations. Dans notre cas ici on va vouloir récupérer deux choses à savoir le
00:00:14 :nom de toutes les catégories qui sont dans la barre ici à gauche et également toutes les imagesqui sont sur cette page d'accueil. Ça va me permettre de vous montrer d'autres techniques
00:00:25 :pour récupérer des informations notamment ici pour récupérer l'attribut source des balises images denotre page HTML. Donc la première chose qu'on va vouloir faire c'est récupérer ici le nom de
00:00:36 :toutes les catégories donc là j'ai un petit peu réorganisé mon espace de travail. On a en basici l'aperçu du HTML donc ça vous pouvez faire un clic droit et inspect vous avez ces outils sur laplupart des navigateurs comme Chrome, Brave, Firefox etc. Donc ça nous permet d'afficher ici
00:00:51 :le HTML et de naviguer pour voir comment on peut récupérer les informations dont on a besoin. Doncnous on voit qu'ici on a un site qui correspond à la barre de navigation sur le côté et on vaavoir différents niveaux ici qui vont être imbriqués les uns dans les autres et au dernier
00:01:07 :niveau ici avec les li on va avoir le titre de chaque catégorie. Donc si je déplie le li icion voit qu'on a un lien et à l'intérieur de ce lien on a bien le nom de la catégorie. Donc vous
00:01:18 :voyez ici qu'on va devoir descendre dans notre HTML donc là il faut bien analyser à quel niveauon peut se placer. On pourrait se dire qu'on va aller directement vers le ul avec la classe
00:01:28 :navlist ça peut être un bon point de départ à voir s'il n'y a pas d'autres endroits sur la pageoù il y aurait une autre ul avec navlist donc là on peut faire une recherche je fais ctrl c,ctrl f pour faire une recherche, ctrl v et là on voit qu'on a juste un élément donc on voit
00:01:43 :one of one ici donc ça veut dire qu'il n'y a qu'un seul élément avec la classe navlist surtoute la page. Donc on pourrait commencer directement ici si on veut être un petit peu
00:01:51 :plus sûr puisqu'il faut toujours penser sur le long terme on peut se dire que ce site en faitva évoluer et que par la suite les développeurs du site pourraient choisir de rajouter d'autresbarres de navigation avec cette même classe donc ça peut être un petit peu risqué de cibler ce
00:02:05 :navlist. Moi je trouve qu'ici le div avec la classe side categories ça me semble un meilleur choixpuisqu'on risque de n'avoir qu'un seul élément ici avec cette classe side categories. Si vous
00:02:16 :voulez être le plus spécifique possible vous pouvez chercher un id puisque les id ils vontêtre uniques sur la page dans ce cas ci on ne voit pas d'id spécifique donc moi je vais mebaser sur ce div avec cette classe side categories qui me semble être un bon indicateur qui va
00:02:29 :rester unique même si le site évolue. Donc je vais cibler ce div ici je reviens dans mon codepython et je vais faire soup.find et on va chercher le div qui a la classe qui est égale à side
00:02:42 :categories. On va vérifier tout de suite si on a bien récupéré ce qu'il faut donc je vais lemettre dans une variable que je vais appeler a side et je vais faire un print de ce side jelance le script et là normalement je devrais récupérer le ul donc la classe ul avec le
00:02:56 :navlist qui est juste en dessous voilà donc on a bien notre side categories et le navlist quiva nous permettre de récupérer les catégories. Donc on va descendre on va faire une variable
00:03:04 :qu'on va appeler categories et on va faire a side.find et on va chercher le ul qui est àl'intérieur donc je ne vais pas spécifier le navlist ici on n'a qu'un seul ul et ensuite onva descendre comme ça puisque à l'intérieur de ce ul on a un li qui correspond à cette classe
00:03:19 :books ici donc là on a un premier lien books et ensuite on a un autre ul avec tous les li quicorrespondent à toutes les catégories. Donc on va descendre comme ça là on est au niveau du
00:03:28 :premier ul on va avoir un seul li ici donc je vais pouvoir faire un seul find et non pas unfind all juste un find et ensuite on a là encore un seul ul donc on va descendre comme ça on vafaire .find et là on va chercher le li et ensuite on va chercher le ul à l'intérieur de ce li. Donc
00:03:45 :je vais faire un print de catégories pour voir si on est bien au bon endroit donc je fais un printje reviens tout en haut ici et on voit qu'on est bien au niveau du ul qui contient tous les li descatégories et donc à l'intérieur de ces li on va pouvoir cibler le texte donc récupérer le texte
00:04:00 :puisque si je viens ici on voit qu'on a un lien et que dans ce lien on a un texte qui correspondau nom de la catégorie. Donc là je vais faire une boucle je vais dire pour catégorie in
00:04:09 :categories .children donc on va boucler sur les enfants de cette catégorie là si je fais unprint de catégories .texte vous allez voir que on va avoir directement le nom de toutes les
00:04:21 :catégories. Le seul petit problème qu'on a ici c'est qu'on a pas mal de bruit autour donc parbruit en fait j'entends tout simplement des espaces ici puisque si on retourne voir dansle html à l'intérieur du lien on voit qu'on a le travel mais le travel il est à la ligne avec
00:04:34 :des espaces et donc c'est ça qu'on a ici on a tous les espaces qui sont autour donc pour enleverces espaces on peut utiliser cette fois ci une méthode de python qui est la méthode strip quiva enlever tous les espaces au début et à la fin de notre chaîne de caractère puisque catégorie
00:04:47 :.texte ici nous retourne un objet de type chaîne de caractère donc on peut utiliser le stripdessus. Donc là si je relance mon script on voit que cette fois ci on a bien enlevé les espaces
00:04:56 :qui étaient avant et après mais si vous regardez bien il y a encore un truc qui devrait voussurprendre c'est qu'on a ici des espaces en fait comme des retours à la ligne alors qu'est ceque c'est est ce que ça vient encore là d'espaces qui n'ont pas été correctement enlevés et bien là
00:05:09 :en fait ce n'est pas ça si vous vous souvenez bien je vous avais dit qu'il y a pas mal d'éléments surnos pages qui vont être des objets non puisque on va avoir des retours à la ligne, des tabulationset plein d'autres choses qui ne correspondent pas à des balises html donc ça comment on peut vérifier
00:05:23 :et bien on peut vérifier si on fait un print de catégorie .name et bien on va avoir soit lenom de la balise soit none puisque l'objet qu'on va récupérer de beautiful soup n'aura pas de nomdonc les balises html elles ont un nom comme li a ul div aside etc et si on est en présence d'un
00:05:39 :élément qui n'est pas une balise html ce nom sera égal à none donc là si je relance le script vousallez voir qu'on va alterner entre les li qui contiennent le nom des catégories et les nonequi correspondent à des retours à la ligne. Donc on va pouvoir utiliser ça pour faire une structure
00:05:53 :conditionnelle on va dire if catégorie .name on va faire un print de catégorie .texte .scriptje relance et là vous allez voir qu'on n'a plus ces espaces entre chaque nom de catégorie et onrécupère bien uniquement le texte à l'intérieur des li. Donc tout ce code ici on peut le simplifier
00:06:08 :avec une compréhension de liste là on a une boucle avec un if on va simplifier tout ça et on va direcategories div ici et on va faire une autre variable categories qui va être égale à une compréhensionde liste donc je vais me donner un petit peu plus d'espace ici pour qu'on puisse voir tout le code
00:06:22 :sur la même ligne. Donc qu'est ce qu'on va faire on va commencer par faire notre book donc je vaisjuste faire child for child in categories div .children donc là on fait juste récupérer
00:06:33 :l'enfant pour chaque enfant dans categories .children et on va faire le if tout de suitedonc if child .name donc seulement si on a un child .name donc là on avait mis categories
00:06:43 :on peut mettre child c'est plus générique ici donc là on va récupérer les enfants pour chaqueenfant dans les enfants de categories .div si on a un nom associé à l'enfant donc on va enlever
00:06:53 :tous les non comme ça et nous ce qu'on veut c'est pas récupérer l'enfant mais le texte avec lestrip ici donc on va copier tout simplement cette partie là et la mettre à la suite de notre childdonc là on récupère le texte de l'enfant sur lequel on a fait un strip pour chaque enfant sur
00:07:07 :categories div .children si on a un name associé à cet enfant donc ça va donner normalement lamême chose là je vais faire un pprint de ma liste categories je relance le script et là on vaavoir exactement la même chose qu'on avait à l'intérieur de notre liste donc on a bien récupéré
00:07:22 :ainsi toutes les catégories de notre site à scraper donc vous voyez ici qu'avec seulement ces troislignes de code on a pu récupérer le texte de toutes les catégories du site et maintenant jevous avais dit qu'on va pouvoir également récupérer des attributs sur des balises donc on va faire le
00:07:36 :test avec les images si j'inspecte ici une image on voit que l'image elle est contenue à l'intérieurdu source donc de l'attribut src ici on a aussi le alt et on a aussi la classe nous ce qui vanous intéresser ici c'est le src donc ce que je vais faire c'est récupérer toutes les images
00:07:52 :pour ça je vais faire un find all directement sur le soup donc sur l'intégralité de notre pagehtml et je vais cibler toutes les images puisque si on regarde ici vous voyez que on a en faitjuste les images des livres donc là encore si vous voulez avoir quelque chose qui va être un
00:08:06 :peu plus pérenne sur le long terme vous pourriez cibler un peu plus précisément donc là parexemple regardez où est ce qu'on est donc là on a une section et c'est tout ce qu'on a on a unesection avec un div qui n'a pas de classe et on a ensuite des ol donc des orders list avec des rangées
00:08:21 :donc voyez que là il n'y a pas grand chose qu'on peut cibler on pourrait cibler directement lasection pour voir s'il ya d'autres sections à l'intérieur de la page donc là je fais unerecherche pour la section on voit qu'on a une seule balise de section sur toute la page donc
00:08:33 :on pourrait déjà faire un find de section et ensuite à l'intérieur faire un find all de imagessi on voulait s'assurer de cibler uniquement les images à l'intérieur de cette partie sinon vouspouvez faire un find all de toutes les images avec le risque que si par la suite les gens qui
00:08:48 :développent le site rajoute des images par exemple ici un logo et bien on récupère également le logoet pas juste les images des livres donc moi je vais garder ça comme ça ici et on va faire doncune boucle pour images in image on va faire un print de la source de l'image donc pour récupérer
00:09:03 :un attribut c'est facile il suffit de faire comme avec les dictionnaires en python c'est à direajouter des crochets et mettre le nom de l'attribut qu'on soit récupéré donc là je vais mettre lenom src je lance le script et là on va avoir les sources de toutes les images à l'intérieur de
00:09:17 :cette section attention cependant avec cette nomenclature c'est exactement comme avec lesdictionnaires de python si l'attribut src n'existe pas on va avoir une erreur donc pour illustrer çaje vais sauvegarder le html dans un fichier donc on va faire with open et on va ouvrir donc leindex.html qui va être dans le même dossier que mon script python on va ouvrir en mode écriture
00:09:38 :et on va ouvrir ça en tant que f et faire un f.write de response.txt donc je commande toutça pour l'instant je n'en ai pas besoin je veux juste écrire le fichier je vais aller dans mesfichiers ici on va aller voir le index.html on vérifie qu'on a bien tout notre doc type ici
00:09:54 :donc c'est bon et on va faire une recherche pour les images donc là on a par exemple l'image dupremier livre et ce que je vais faire c'est enlever cette source ici pour enlever l'attributsource sur cette première image donc qui correspond au premier livre je sauvegarde le fichier et là
00:10:08 :cette fois ci ce qu'on va faire c'est que plutôt que d'aller chercher le html depuis le response.txtdonc depuis le résultat de la requête qui a été effectué avec le module request on va aller lechercher à l'intérieur de notre fichier donc là on va faire with open et on va ouvrir le fichier
00:10:23 :index.html en mode lecture as f on va créer une variable html qui va être égale à f.read donc çava lire l'intégralité du fichier index.html là je peux enlever ces lignes de code puisque je n'ai
00:10:35 :plus besoin dans ce cas ci d'aller chercher le html sur internet je l'ai directement sur monfichier et à la place du response.txt ici je vais passer ma variable html et donc là ce qu'on va
00:10:47 :avoir comme problème c'est que sur la première image on n'a plus l'attribut source et quand onpasse par cette façon de faire avec les crochets vous allez voir que ça ne va pas fonctionner onva avoir une erreur de keyerror donc comme avec les dictionnaires keyerror qui indique qu'on n'a
00:10:59 :pas trouvé d'attribut src donc là si vous voulez éviter ça on utilise .get et ça va être làencore exactement comme les dictionnaires le .get va nous retourner la valeur si elle existe et va
00:11:10 :nous retourner none si elle n'existe pas donc je relance et là on voit qu'on n'a plus d'erreursauf que sur la première image on a bien le none qui nous est retourné. Donc voilà pour récupérer
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.