Raclage de pages Web en python avec une belle soupe notions de base

Dans un précédent tutoriel, je vous ai montré comment utiliser le module Requests pour accéder à des pages Web à l'aide de Python. Le didacticiel a abordé de nombreux sujets, tels que la création de requêtes GET / POST et le téléchargement de programmes tels que des images ou des PDF. La seule chose qui manquait dans ce tutoriel était un guide sur la suppression des pages Web auxquelles vous avez accédé à l'aide de Requests pour extraire les informations dont vous avez besoin..

Dans ce didacticiel, vous découvrirez Beautiful Soup, une bibliothèque Python permettant d'extraire des données à partir de fichiers HTML. Dans ce tutoriel, l’accent sera mis sur l’apprentissage des bases de la bibliothèque et des sujets plus avancés seront abordés dans le prochain tutoriel. Notez que ce didacticiel utilise Beautiful Soup 4 pour tous les exemples..

Installation

Vous pouvez installer Beautiful Soup 4 en utilisant pépin. Le nom du paquet est beautifulsoup4. Cela devrait fonctionner à la fois sur Python 2 et Python 3.

$ pip installer beautifulsoup4

Si vous n’avez pas installé pip sur votre système, vous pouvez directement télécharger le fichier d’archive source Beautiful Soup 4 et l’installer à l’aide de setup.py.

$ python setup.py install

BeautifulSoup est à l’origine emballé sous forme de code Python 2. Lorsque vous l'installez pour l'utiliser avec Python 3, il est automatiquement mis à jour vers le code Python 3. Le code ne sera pas converti à moins que vous n'installiez 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..

Installer un analyseur

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

depuis bs4 import BeautifulSoup soup = BeautifulSoup ("

C'est HTML invalide

"," html.parser ")

le BeautifulSoup object peut accepter deux arguments. Le premier argument est le balisage réel et le second argument est l'analyseur que vous souhaitez utiliser. Les différents analyseurs sont: html.parser, lxml et html5lib. le lxml l'analyseur a deux versions, un analyseur HTML et un analyseur XML.

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

$ pip installer lxml $ pip installer html5lib

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

soupe = BeautifulSoup ("

C'est HTML invalide

"," html.parser ") print (soupe) #

C'est HTML invalide

soupe = BeautifulSoup ("

C'est HTML invalide

"," lxml ") print (soupe) #

C'est HTML invalide

soupe = BeautifulSoup ("

C'est HTML invalide

"," xml ") print (soupe) # #

C'est HTML invalide

soupe = BeautifulSoup ("

C'est HTML invalide

"," html5lib ") print (soupe) #

C'est HTML invalide

Les différences soulignées dans l'exemple ci-dessus ne sont importantes que lorsque vous analysez du HTML non valide. Cependant, la plupart du code HTML sur le Web est mal formé, et connaître ces différences vous aidera à résoudre certaines erreurs d’analyse et à choisir l’analyseur que vous souhaitez utiliser dans un projet. En général, le lxml l'analyseur est un très bon choix.

Objets dans une belle soupe

Beautiful Soup analyse le document HTML donné dans un arbre d'objets Python. Vous devez connaître quatre objets Python principaux: ÉtiquetteNavigableStringBeautifulSoup, et Commentaire.

le Étiquette objet fait référence à une balise XML ou HTML réelle dans le document. Vous pouvez accéder au nom d’une balise en utilisant tag.name. Vous pouvez également définir le nom d'une balise sur quelque chose d'autre. Le changement de nom sera visible dans le balisage généré par Beautiful Soup.

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

Le texte dans une balise est stocké en tant que NavigableString dans une belle soupe. Il a 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 d'une page Web. Ces commentaires sont stockés en tant que Commentaire objet, qui est aussi fondamentalement un NavigableString.

Vous avez déjà appris sur le BeautifulSoup objet dans la section précédente. Il est utilisé pour représenter le document dans son ensemble. Puisqu'il ne s'agit pas d'un objet réel, il n'a pas de nom ni d'attribut.

Obtenir le titre, les en-têtes et les liens

Vous pouvez extraire très facilement le titre de la page et d’autres données de ce type à l’aide de Beautiful Soup. Nous allons gratter la page Wikipedia sur Python. Tout d'abord, vous devrez obtenir le balisage de la page à l'aide du code suivant basé sur le didacticiel du module Requêtes pour accéder aux pages Web..

importer des demandes à partir de bs4 import BeautifulSoup req = requests.get ('https://en.wikipedia.org/wiki/Python_ (langage_programmation)') soup = BeautifulSoup (req.text, "lxml")

Maintenant que vous avez créé la soupe, vous pouvez obtenir le titre de la page Web à l'aide du code suivant:

soup.title # Python (langage de programmation) - Wikipedia soup.title.name # 'title' soup.title.string # 'Python (langage de programmation) - Wikipedia'

Vous pouvez également consulter la page Web pour d’autres informations telles que l’en-tête ou le premier paragraphe, leurs classes ou identifiant attribut.

soup.h1 # 

Python (langage de programmation)

soup.h1.string # 'Python (langage de programmation)' soup.h1 ['class'] # ['firstHeading'] soup.h1 ['id'] # 'firstHeading' soup.h1.attrs # 'class': ['firstHeading'], 'id': 'firstHeading', 'lang': 'en' soup.h1 ['class'] = 'firstHeading, mainHeading' soup.h1.string.replace_with ("Python - Langage de programmation" ) del soup.h1 ['lang'] del soup.h1 ['id'] soup.h1 #

Python - Langage de programmation

De même, vous pouvez parcourir tous les liens ou sous-titres d'un document à l'aide du code suivant:

pour sub_heading dans soup.find_all ('h2'): print (sub_heading.text) # tous les sous-titres tels que Contents, History [edit]… 

Naviguer dans le DOM

Vous pouvez naviguer dans l'arborescence DOM en utilisant des noms de balises ordinaires. Le chaînage de ces noms de balises 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 Wikipedia donnée en utilisant soup.p.a. Tous les liens du premier paragraphe sont accessibles en utilisant soup.p.find_all ('a').

Vous pouvez également accéder à tous les enfants d’une balise sous forme de liste en utilisant tag.contents. Pour obtenir les enfants à un index spécifique, vous pouvez utiliser tag.contents [index]. Vous pouvez également parcourir les enfants d’une balise à l’aide de la touche .les enfants attribut.

Tous les deux .les enfants et .Contenu ne sont utiles que lorsque vous souhaitez accéder aux descendants directs ou de premier niveau d'une balise. Pour obtenir tous les descendants, vous pouvez utiliser le .descendance attribut.

print (soup.p.contents) # [Python, 'est largement utilisé',… la liste complète] print (soup.p.contents [10]) # lisibilité pour un enfant dans soup.p.children: print (child.name) # b # Aucun # a # Aucun # a # Aucun #… et ainsi de suite.

Vous pouvez également accéder au parent d'un élément à l'aide de la commande .parent attribut. De même, vous pouvez accéder à tous les ancêtres d’un élément à l’aide de la .Parents attribut. Le parent du plus haut niveau la balise est la BeautifulSoup L'objet lui-même et son parent est None.

print (soup.p.parent.name) # div pour le parent dans soup.p.parents: print (parent.name) # div # div # div # body # html # [document]

Vous pouvez accéder au frère précédent et au suivant d'un élément en utilisant le .previous_sibling et .next_sibling les attributs. 

Pour que deux éléments soient frères et sœurs, ils doivent avoir le même parent. Cela signifie que le premier enfant d'un élément n'aura pas de frère précédent. De même, le dernier enfant de l'élément n'aura pas de prochain frère. Dans les pages Web actuelles, les frères et soeurs précédents et suivants d'un élément seront probablement des caractères de nouvelle ligne.. 

Vous pouvez également parcourir tous les frères et sœurs d'un élément en utilisant .précédents_siblings et .next_siblings.

soup.head.next_sibling # '\ n' soupe.p.a.next_sibling # 'pour' soup.p.a.previous_sibling # 'est un' print très utilisé '(soup.p.b.previous_sibling) # None

Vous pouvez aller à l'élément qui vient immédiatement après l'élément actuel en utilisant le .next_element attribut. Pour accéder à l'élément qui vient immédiatement avant l'élément en cours, utilisez la commande .article précédent attribut. 

De même, vous pouvez parcourir tous les éléments qui viennent avant et après l’élément actuel en utilisant .éléments précédents et .next_elements respectivement.

Dernières pensées

Après avoir terminé ce tutoriel, vous devriez maintenant bien comprendre les principales différences entre les différents analyseurs HTML. Vous devriez maintenant pouvoir naviguer sur une page Web et extraire des données importantes. Cela peut être utile lorsque vous souhaitez analyser tous les en-têtes ou les liens d'un site Web donné..

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