Python pas cher
Bien que les expressions régulières soient idéales pour la mise en correspondance de modèles en général, il est parfois plus facile d’utiliser un analyseur HTML explicitement conçu pour analyser les pages HTML. Il existe de nombreux outils Python écrits à cet effet, mais la bibliothèque Beautiful Soup est un bon point de départ.
Installez Beautiful Soup
Pour installer Beautiful Soup, vous pouvez exécuter ce qui suit dans votre terminal:
$ python3 -m pip installer beautifulsoup4
Courir spectacle de pip
pour voir les détails du package que vous venez d'installer:
$ python3 -m pip show beautifulsoup4
Nom: beautifulsoup4
Version: 4.9.1
Résumé: bibliothèque de capture d'écran
Page d'accueil: http://www.crummy.com/software/BeautifulSoup/bs4/
Auteur: Leonard Richardson
E-mail de l'auteur: leonardr@segfault.org
Licence: MIT
Emplacement: c: realpython venv lib site-packages
A besoin:
Requis par:
En particulier, notez que la dernière version au moment de la rédaction était la 4.9.1.
Créer un BeautifulSoup
Objet
Tapez le programme suivant dans une nouvelle fenêtre d'éditeur:
de bs4 importer BeautifulSoup
de urllib.request importer urlopen
URL = "http://olympus.realpython.org/profiles/dionysus"
page = urlopen(URL)
html = page.lis().décoder("utf-8")
soupe = BeautifulSoup(html, "html.parser")
Ce programme fait trois choses:
-
Ouvre l'URL
http://olympus.realpython.org/profiles/dionysus
en utilisanturlopen ()
duurllib.request
module -
Lit le code HTML de la page sous forme de chaîne et l'attribue au
html
variable -
Crée un
BeautifulSoup
objet et l'affecte ausoupe
variable
le BeautifulSoup
objet affecté à soupe
est créé avec deux arguments. Le premier argument est le HTML à analyser, et le second argument, la chaîne "html.parser"
, indique à l'objet quel analyseur utiliser dans les coulisses. "html.parser"
représente l'analyseur HTML intégré de Python.
Utiliser un BeautifulSoup
Objet
Enregistrez et exécutez le programme ci-dessus. Une fois son exécution terminée, vous pouvez utiliser le soupe
variable dans la fenêtre interactive pour analyser le contenu de html
de diverses façons.
Par exemple, BeautifulSoup
les objets ont un .get_text ()
méthode qui peut être utilisée pour extraire tout le texte du document et supprimer automatiquement les balises HTML.
Tapez le code suivant dans la fenêtre interactive d'IDLE:
>>> impression(soupe.get_text())
Profil: Dionysos
Nom: Dionysus
Ville natale: Mont Olympe
Animal préféré: Léopard
Couleur préférée: vin
Il y a beaucoup de lignes vides dans cette sortie. Celles-ci sont le résultat de caractères de nouvelle ligne dans le texte du document HTML. Vous pouvez les supprimer avec la chaîne .remplacer()
méthode si vous en avez besoin.
Souvent, vous devez obtenir uniquement du texte spécifique d'un document HTML. Utiliser d'abord Beautiful Soup pour extraire le texte, puis utiliser le .trouver()
la méthode de chaîne est quelquefois plus facile que de travailler avec des expressions régulières.
Cependant, les balises HTML elles-mêmes sont parfois les éléments qui indiquent les données que vous souhaitez récupérer. Par exemple, vous souhaitez peut-être récupérer les URL de toutes les images de la page. Ces liens sont contenus dans le src
attribut de Balises HTML.
Dans ce cas, vous pouvez utiliser Trouver tout()
pour renvoyer une liste de toutes les instances de cette balise particulière:
>>> soupe.Trouver tout("img")
[[[[, ]
Cela renvoie une liste de tous balises dans le document HTML. Les objets de la liste semblent être des chaînes représentant les balises, mais ce sont en fait des instances du
Marque
objet fourni par Beautiful Soup. Marque
Les objets fournissent une interface simple pour travailler avec les informations qu'ils contiennent.
Explorons cela un peu en déballant d'abord le Marque
objets de la liste:
>>> image1, image2 = soupe.Trouver tout("img")
Chaque Marque
l'objet a un .Nom
propriété qui renvoie une chaîne contenant le type de balise HTML:
Vous pouvez accéder aux attributs HTML du Marque
objet en mettant leur nom entre crochets, comme si les attributs étaient des clés dans un dictionnaire.
Par exemple, le la balise a un seul attribut,
src
, avec la valeur "http://realpython.com/static/dionysus.jpg"
. De même, une balise HTML telle que le lien a deux attributs,
href
et cible
.
Pour obtenir la source des images dans la page de profil de Dionysus, vous accédez au src
attribut utilisant la notation de dictionnaire mentionnée ci-dessus:
>>> image1[[[["src"]
"http://realpython.com/static/dionysus.jpg"
>>> image2[[[["src"]
'/static/grapes.png'
Certaines balises dans les documents HTML sont accessibles par les propriétés du Marque
objet. Par exemple, pour obtenir le
dans un document, vous pouvez utiliser la .Titre
propriété:
>>> soupe.Titre
Profil: Dionysos
Si vous regardez la source du profil Dionysus en accédant à la page de profil, en cliquant avec le bouton droit sur la page et en sélectionnant Afficher la source de la page, alors vous remarquerez que le
La balise telle qu'elle est écrite dans le document ressemble à ceci:
<Titre >Profil: Dionysos</ title />
Beautiful Soup nettoie automatiquement les balises pour vous en supprimant l'espace supplémentaire dans la balise d'ouverture et la barre oblique superflue (/
) dans la balise de fermeture.
Vous pouvez également récupérer uniquement la chaîne entre les balises de titre avec le .chaîne
propriété du Marque
objet:
>>> soupe.Titre.chaîne
'Profil: Dionysos'
L'une des fonctionnalités les plus utiles de Beautiful Soup est la possibilité de rechercher des types spécifiques de balises dont les attributs correspondent à certaines valeurs. Par exemple, si vous voulez trouver tous les les balises qui ont un
src
attribut égal à la valeur /static/dionysus.jpg
, vous pouvez alors fournir l'argument supplémentaire suivant à .Trouver tout()
:
>>> soupe.Trouver tout("img", src="http://realpython.com/static/dionysus.jpg")
[[[[]
Cet exemple est quelque peu arbitraire et l'utilité de cette technique peut ne pas ressortir de l'exemple. Si vous passez du temps à parcourir divers sites Web et à consulter les sources de leurs pages, vous remarquerez que de nombreux sites Web ont des structures HTML extrêmement complexes.
Lorsque vous récupérez des données de sites Web avec Python, vous êtes souvent intéressé par certaines parties de la page. En passant du temps à parcourir le document HTML, vous pouvez identifier les balises avec des attributs uniques que vous pouvez utiliser pour extraire les données dont vous avez besoin.
Ensuite, au lieu de s'appuyer sur des expressions régulières compliquées ou d'utiliser .trouver()
pour parcourir le document, vous pouvez accéder directement à la balise particulière qui vous intéresse et extraire les données dont vous avez besoin.
Dans certains cas, vous constaterez peut-être que Beautiful Soup n'offre pas les fonctionnalités dont vous avez besoin. La bibliothèque lxml est un peu plus délicate à démarrer mais offre beaucoup plus de flexibilité que Beautiful Soup pour l'analyse des documents HTML. Vous voudrez peut-être le vérifier une fois que vous serez à l'aise avec Beautiful Soup.
Remarque: Les analyseurs HTML comme Beautiful Soup peuvent vous faire gagner beaucoup de temps et d'efforts lorsqu'il s'agit de localiser des données spécifiques dans des pages Web. Cependant, le HTML est parfois si mal écrit et désorganisé que même un analyseur sophistiqué comme Beautiful Soup ne peut pas interpréter correctement les balises HTML.
Dans ce cas, il vous reste souvent à utiliser .trouver()
et des techniques d'expression régulière pour essayer d'analyser les informations dont vous avez besoin.
BeautifulSoup est idéal pour extraire des données du code HTML d'un site Web, mais il ne fournit aucun moyen de travailler avec des formulaires HTML. Par exemple, si vous avez besoin de rechercher une requête sur un site Web, puis de récupérer les résultats, BeautifulSoup à lui seul ne vous mènera pas très loin.
Vérifie ta compréhension
Développez le bloc ci-dessous pour vérifier votre compréhension.
Écrivez un programme qui saisit le HTML complet de la page à l'URL http://olympus.realpython.org/profiles
.
À l'aide de Beautiful Soup, imprimez une liste de tous les liens de la page en recherchant les balises HTML avec le nom une
et récupérer la valeur prise par le href
attribut de chaque balise.
La sortie finale devrait ressembler à ceci:
http://olympus.realpython.org/profiles/aphrodite
http://olympus.realpython.org/profiles/poseidon
http://olympus.realpython.org/profiles/dionysus
Vous pouvez développer le bloc ci-dessous pour voir une solution:
Tout d'abord, importez le urlopen
fonction de la urlib.request
module et le BeautifulSoup
classe de la bs4
paquet:
de urllib.request importer urlopen
de bs4 importer BeautifulSoup
Chaque URL de lien sur le / profils
page est une URL relative, alors créez une base_url
variable avec l'URL de base du site Web:
base_url = "http://olympus.realpython.org"
Vous pouvez créer une URL complète en concaténant base_url
avec une URL relative.
Ouvrez maintenant le / profils
page avec urlopen ()
et utilise .lis()
pour obtenir la source HTML:
html_page = urlopen(base_url + "/ profiles")
html_text = html_page.lis().décoder("utf-8")
Une fois la source HTML téléchargée et décodée, vous pouvez créer un nouveau BeautifulSoup
objet pour analyser le HTML:
soupe = BeautifulSoup(html_text, "html.parser")
soup.find_all ("a")
renvoie une liste de tous les liens dans la source HTML. Vous pouvez parcourir cette liste pour imprimer tous les liens de la page Web:
pour lien dans soupe.Trouver tout("une"):
lien_url = base_url + lien[[[["href"]
impression(lien_url)
L'URL relative de chaque lien est accessible via le "href"
indice. Concaténer cette valeur avec base_url
pour créer le plein lien_url
.
Lorsque vous êtes prêt, vous pouvez passer à la section suivante.
[ad_2]