Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Python
Code

Récolter des pages Web dans Python avec Beautiful Soup: les bases

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Scraping Webpages in Python with Beautiful Soup.
Scraping Webpages in Python With Beautiful Soup: Search and DOM Modification

French (Français) translation by New Lune (you can also view the original English article)

Dans un tutoriel précédent, je vous ai montré comment utiliser le module Requests pour accéder aux pages Web en utilisant Python. Le tutoriel couvre beaucoup de sujets comme la réalisation des requêtes GET/POST et le téléchargement de choses comme des images ou des fichiers PDF par programme. La seule chose qui manquait à ce tutoriel était un guide sur les pages de grattage auxquelles vous avez accédé à l'aide de Requests pour extraire les informations dont vous avez besoin.

Dans ce tutoriel, vous apprendrez à propos de Beautiful Soup, qui est une bibliothèque Python pour extraire des données à partir de fichiers HTML. L'accent mis sur ce tutoriel sera l'apprentissage des bases de la bibliothèque et des sujets plus avancés seront abordés dans le prochain tutoriel. Veuillez noter que ce tutoriel utilise Beautiful Soup 4 pour tous les exemples.

Installation

Vous pouvez installer Beautiful Soup 4 à l'aide de pip. Le nom du package est beautifulsoup4. Il devrait fonctionner sur Python 2 et Python 3.

Si vous n'avez pas de pip installé sur votre système, vous pouvez télécharger directement la tablette source Beautiful Soup 4 et l'installer à l'aide de setup.py.

BeautifulSoup est initialement emballé sous le code Python 2. Lorsque vous l'installez pour l'utiliser avec Python 3, il est automatiquement mis à jour pour le code Python 3. Le code ne sera pas converti à moins d'installer le paquet. Voici quelques erreurs courantes que vous pourriez remarquer:

  • Le "Aucun module nommé HTMLParser" ImportError se produit lorsque vous exécutez la version Python 2 du code sous Python 3.
  • Le "Aucun module nommé html.parser" ImportError se produit lorsque vous exécutez la version Python 3 du code sous Python 2.

Les deux erreurs ci-dessus peuvent être corrigées en désinstallant et en réinstallant Beautiful Soup.

Installation d'un analyseur

Avant de discuter des différences entre différents analyseurs que vous pouvez utiliser avec Beautiful Soup, écrivez le code pour créer une soupe.

L'objet BeautifulSoup peut accepter deux arguments. Le premier argument est le marquage actuel, et le second argument est l'analyseur que vous souhaitez utiliser. Les différents analyseurs sont: html.parser, lxml et html5lib. L'analyseur lxml comporte deux versions, un analyseur HTML et un analyseur XML.

Le html.parser est un analyseur intégré, et cela ne fonctionne pas si bien dans les anciennes versions de Python. Vous pouvez installer les autres analyseurs à l'aide des commandes suivantes:

L'analyseur lxml est très rapide et peut être utilisé pour analyser rapidement le HTML. D'autre part, l'analyseur html5lib est très lent, mais il est également extrêmement indulgent. Voici un exemple d'utilisation de chacun de ces analyseurs:

Les différences décrites dans l'exemple ci-dessus ne concernent que lorsque vous analysez le code HTML invalide. Cependant, la plupart du HTML sur le Web est mal formé et, en sachant que ces différences vous aideront à déboguer des erreurs d'analyse et à décider quel analyseur vous souhaitez utiliser dans un projet. Généralement, l'analyseur lxml est un très bon choix.

Objets dans Beautiful Soup

Beautiful Soup analyse le document HTML donné dans un arbre d'objets Python. Il existe quatre objets Python principaux dont vous devez connaître: Tag, NavigableString, BeautifulSoup et Comment.

L'objet Tag se réfère à une balise XML ou HTML réelle dans le document. Vous pouvez accéder au nom d'une étiquette en utilisant tag.name. Vous pouvez également définir le nom d'une étiquette à autre chose. Le changement de nom sera visible dans le balisage généré par Beautiful Soup.

Vous pouvez accéder à différents attributs comme la classe et l'id d'une balise en utilisant tag['class'] et tag['id'] respectivement. Vous pouvez également accéder à l'ensemble du dictionnaire des attributs à l'aide de tag.attrs. Vous pouvez également ajouter, supprimer ou modifier les attributs d'une étiquette. Les attributs comme la class d'un élément qui peut prendre plusieurs valeurs sont stockés sous forme de liste.

Le texte dans une balise est stocké en tant que NavigableString dans Beautiful Soup. Il existe quelques méthodes utiles comme replace_with("string") pour remplacer le texte dans une balise. Vous pouvez également convertir un NavigableString en chaîne unicode en utilisant unicode().

Beautiful Soup vous permet également d'accéder aux commentaires dans une page Web. Ces commentaires sont stockés sous forme d'un objet Comment, qui est également essentiellement un NavigableString.

Vous avez déjà appris l'objet BeautifulSoup dans la section précédente. Il est utilisé pour représenter le document dans son ensemble. Comme ce n'est pas un objet réel, il n'a aucun nom ou attributs.

Obtenir le titre, les titres et les liens

Vous pouvez extraire le titre de la page et d'autres données de cette manière très facilement en utilisant Beautiful Soup. Récoltez la page Wikipédia sur Python. Tout d'abord, vous devrez obtenir le balisage de la page en utilisant le code suivant en fonction du tutoriel du module Requests pour accéder aux pages Web.

Maintenant que vous avez créé la soupe, vous pouvez obtenir le titre de la page Web en utilisant le code suivant:

Vous pouvez également racler la page Web pour d'autres informations comme le titre principal ou le premier paragraphe, leurs classes ou l'attribut id.

De même, vous pouvez itérer dans tous les liens ou sous-titres d'un document en utilisant le code suivant:

Navigation dans le DOM

Vous pouvez naviguer dans l'arborescence DOM en utilisant des noms de balises réguliers. Le chaînage de ces noms d'étiquettes peut vous aider à naviguer plus profondément dans l'arbre. Par exemple, vous pouvez obtenir le premier lien dans le premier paragraphe de la page Wikipédia donnée en utilisant soup.p.a. Tous les liens du premier paragraphe peuvent être consultés en utilisant soup.p.find_all('a').

Vous pouvez également accéder à tous les enfants d'une étiquette en tant que liste en utilisant tag.contents. Pour obtenir les enfants à un index spécifique, vous pouvez utiliser tag.contents[index]. Vous pouvez également itérer sur les enfants d'une étiquette en utilisant l'attribut .children.

Les .children et les .contents ne sont utiles que lorsque vous souhaitez accéder aux descendants directs ou de premier niveau d'une étiquette. Pour obtenir tous les descendants, vous pouvez utiliser l'attribut .descendants.

Vous pouvez également accéder au parent d'un élément en utilisant l'attribut .parent. De même, vous pouvez accéder à tous les ancêtres d'un élément en utilisant l'attribut .parents. Le parent de la balise de niveau supérieur <html> est l'objet BeautifulSoup lui-même, et son parent est None.

Vous pouvez accéder aux frères et sœurs précédents et suivants d'un élément en utilisant les attributs .previous_sibling et .next_sibling.

Pour deux éléments d'être frères et sœurs, ils devraient avoir le même parent. Cela signifie que le premier enfant d'un élément n'aura pas de fratrie précédente. De même, le dernier enfant de l'élément n'aura pas de prochain frère ou sœur. Dans les pages Web réelles, les frères et sœurs précédents et suivants d'un élément seront probablement un nouveau caractère de ligne.

Vous pouvez également itérer sur toutes les frères et sœurs d'un élément en utilisant .previous_siblings et .next_siblings.

Vous pouvez accéder à l'élément qui vient immédiatement après l'élément actuel en utilisant l'attribut .next_element. Pour accéder à l'élément qui vient immédiatement avant l'élément actuel, utilisez l'attribut .previous_element.

De même, vous pouvez itérer sur tous les éléments précédents et après l'élément actuel à l'aide de .previous_elements et .next_elements respectivement.

Dernières pensées

Après avoir terminé ce tutoriel, vous devriez maintenant avoir une bonne compréhension des principales différences entre les différents analyseurs HTML. Vous devriez maintenant pouvoir naviguer dans une page Web et extraire des données importantes. Cela peut être utile lorsque vous souhaitez analyser toutes les rubriques ou les liens sur un site Web donné.

Dans la prochaine partie de la série, vous apprendrez à utiliser la bibliothèque Beautiful Soup pour rechercher et modifier le DOM.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.