Beautiful Soup est un module Python qui nous permet de récupérer des parties très précises de sites Web, comme des images, des liens, des résultats de recherche etc...
Grâce à ça, on va pouvoir créer des programmes Python super cool pour faire des recherches poussées sur des sites Web ! :D
Pour se servir de Beautiful Soup, la première chose qu'on aura besoin de faire... C'est de ne pas se servir de Beautiful Soup ;)
En fait, il faut déjà connaître la structure du site ! Qu'est ce qu'on cherche ? Sur quel site ? Des images ? Du texte ? Des descriptions ? Bref, il faut déjà cibler notre recherche et s'adapter à la structure du site choisi.
L'exemple que je vais donner sur cette page sera une recherche de recettes de cuisine sur le site Spoonacular :)
Le but sera de trouver des recettes utilisant des ingrédients que l'utilisateur du programme choisira.
Par ailleurs, la méthode que je vais utiliser pour cibler ma recherche fonctionne pour une grande majorité des sites !
Cependant, on ne pourra pas utiliser Beautiful Soup avec des sites qui n'ont pas de structure fixe (c'est à dire que la structure d'une page peut changer d'une recherche à l'autre). C'est notamment le cas de YouTube... Donc attention aux sites que tu choisis !!
À titre d'exemple, on va donc faire une recherche sur Spoonacular, pour toutes les recettes qui contiennent du pain et de la viande :)
En tapant bread (pain) et meat (viande) dans la barre de recherche du site, je tombe donc sur une page de résultats avec plein de recettes qui contiennent ces deux ingrédients !
Sur l'image, on voit seulement les 3 premières recettes, mais il y en a beaucoup plus ;)
Pour savoir quelles sont les informations qu'on veut récupérer via notre code dans le futur, on va devoir regarder le code HTML de la page... Mais c'est fastoche, pas d'inquiétude :D
Le code HTML, c'est toutes les informations d'une page, ordonnées et rangées dans des balises spéciales en fonction de leur contenu.
Pour faire très simple, par exemple, une balise ressemble à peu près à ça : <img>, ou <p>, ou encore <div> !
Il y en a pour tout ! Les images, le texte, les liens... Bref, nous on va devoir aller chercher la balise qui contient le lien de la recette ;)
Pour ce faire, on peut aller voir le code HTML de l'image de la recette, qui contient aussi son lien, en faisant un Clic droit et Inspecter !
Pour info, voici les principales balises HTML utilisées ;)
C'est celles dont tu te serviras probablement le plus avec Beautiful Soup !
Quand on est en mode "Inspection", quand on passe la souris sur une ligne HTML, le navigateur va "éclairer" la zone du site qui correspond à la ligne en question !
Sur l'image de gauche, on peut voir que l'image sur laquelle on a fait "Inspecter" correspond à une balise <div> par exemple ;) De cette façon, on peut passer notre souris sur les différentes lignes pour trouver très facilement la balise qu'on cherche !
Ce qu'on cherche précisément, c'est le lien de la recette. En HTML, un lien se trouve toujours dans une balise <a> !
Si on regarde mieux le HTML autour de l'endroit qu'on a inspecté (en rouge), on peut voir qu'il y a effectivement une balise <a> qui contient le lien de la recette (en vert).
C'est la balise qu'il nous faut !!
On remarque d'ailleurs que le lien n'est pas complet : il manque juste le début de l'URL ("https://spoonacular.com/")... On devra l'ajouter par la suite :)
Cependant, ce n'est pas encore fini... ;) On a besoin d'une dernière petite manip !
Le truc, c'est qu'on ne peut pas récupérer directement le lien de la recette, car rien ne le différencie des autres liens.
C'est une balise <a> classique, avec seulement le lien à l'intérieur :)
En HTML, pour différencier les balises entre elles, on utilise ce qu'on appelle des class et des id. Pour arriver à récupérer le lien, on doit obligatoirement récupérer une balise avec une classe ET qui contient notre balise a.
Heureusement, si on regarde bien le HTML autour du lien, on remarque qu'il se trouve en dessous d'une <div>... Qui a une classe :D
Sur l'image, elle est entourée en orange avec une flèche, et la classe s'appelle recipeImageBox ;)
On a terminé notre recherche sur le HTML du site !
On a appris tout ce qu'on voulait savoir :
On garde bien ces infos en tête, et on s'en sert juste après dans le code exemple ;)
Mais juste avant, voyons les 4 fonctions utiles que nous allons utiliser dans Beautiful Soup pour récupérer ces fameux liens de recettes !
On commence avec la base de la base ! Il va falloir récupérer le code html du site sur lequel on veut chercher, et le transformer dans un format "cherchable" dans lequel on va pouvoir trouver toutes les balises qu'on veut :)
Pour ça, on doit passer le HTML extrait du site dans un objet "BeautifulSoup" qui va faire la transformation ! On récupère le résultat dans la variable soup.
La fonction find_all() permet de trouver toutes les balises HTML qui correspondent aux critères précisés.
Par exemple, avec la ligne ci-contre, on va chercher toutes les balises qui ont la classe recipeImageBox... Tu commences à comprendre l'intérêt de la recherche de toute à l'heure ? ;)
La fonction find() permet de trouver une balise spécifique dans un élément.
Par exemple, avec la ligne ci-contre, on va trouver la balise <a> dans la recette sélectionnée !
La fonction get() permet de récupérer la valeur d'un attribut HTML !
Par exemple, avec la ligne ci-contre, on va récupérer le texte contenu dans l'attribut href d'un élément. On se rappelle que le texte du lien était contenu dans l'attribut href de la balise <a>... Du coup en combinant toutes ces lignes de code on peut récupérer le lien de la recette ! :D
Et enfin, un tout petit encart pour expliquer comment faire la recherche sur le site depuis le code ;)
Si on regarde sur le site la forme de l'URL après ma recherche, on remarque que c'est tout bêtement l'URL de base du site, suivie des deux ingrédients de ma recherche !
Voici quelques exemples de différents sites qui ont une construction d'URL différente. Il faut bien faire attention à la structure de l'URL sur chaque site pour bien construire l'URL dans ton code par la suite ;)
Du coup, si on veut recréer ce type de recherche en code, il suffit d'ajouter les ingrédients choisis par l'utilisateur à l'URL de base, comme dans le bout de code ci-dessus ! ;)
Pour finir, voici un exemple de code qui reprend tout ce qu'on a dit depuis le début de cette page tuto :)
Avec ce code, on va faire une recherche sur Spoonacular, récupérer toutes les <div> qui possèdent la classe recipeImageBox, et extraire le lien situé dans le href de la balise <a> !