Vous êtes sur la page 1sur 13

beautifulsoup

#beautifulso
up
Table des matières
À propos 1

Chapitre 1: Commencer avec beautifulsoup 2

Remarques 2

Versions 3

Examples 3

Installation ou configuration 3

Un exemple de grattage BeautifulSoup "Hello World" 3

Chapitre 2: Éléments de localisation 6

Examples 6

Localiser un texte après un élément dans BeautifulSoup 6

Utilisation de sélecteurs CSS pour localiser des éléments dans BeautifulSoup 6

Localisation des commentaires 7

Fonctions de filtrage 7

Utilisation de base 7

Fournir des arguments supplémentaires pour filtrer les fonctions 8

Accès aux balises internes et à leurs attributs de la balise initialement sélectionnée 8

Collecter des éléments facultatifs et / ou leurs attributs à partir de séries de pages 9

Crédits 11
À propos
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: beautifulsoup

It is an unofficial and free beautifulsoup ebook created for educational purposes. All the content is
extracted from Stack Overflow Documentation, which is written by many hardworking individuals at
Stack Overflow. It is neither affiliated with Stack Overflow nor official beautifulsoup.

The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.

Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to info@zzzprojects.com

https://riptutorial.com/fr/home 1
Chapitre 1: Commencer avec beautifulsoup
Remarques
Dans cette section, nous discutons de ce qu'est Beautiful Soup, de son utilisation et d'un bref
aperçu de son utilisation.

Beautiful Soup est une bibliothèque Python qui utilise votre analyseur html / xml pré-installé et
convertit la page Web / html / xml en une arborescence composée de balises, d’éléments,
d’attributs et de valeurs. Pour être plus précis, l’arbre est constitué de quatre types d’objets, Tag,
NavigableString, BeautifulSoup et Comment. Cet arbre peut ensuite être "interrogé" en utilisant les
méthodes / propriétés de l'objet BeautifulSoup créé à partir de la bibliothèque de l'analyseur.

Votre besoin: vous avez souvent l'un des besoins suivants:

1. Vous souhaiterez peut-être analyser une page Web pour déterminer le nombre de balises
trouvées, le nombre d'éléments de chaque balise détectés et leurs valeurs. Vous voudrez
peut-être les changer.

2. Vous souhaiterez peut-être déterminer les noms et les valeurs des éléments afin de pouvoir
les utiliser conjointement avec d'autres bibliothèques pour l'automatisation de pages Web,
telles que Selenium .

3. Vous pouvez souhaiter transférer / extraire des données affichées dans une page Web vers
d'autres formats, tels qu'un fichier CSV ou une base de données relationnelle telle que
SQLite ou mysql. Dans ce cas, la bibliothèque vous aide dans la première étape, à
comprendre la structure de la page Web, bien que vous utilisiez d'autres bibliothèques pour
effectuer l'acte de transfert.

4. Vous voudrez peut-être savoir combien d’éléments sont stylés avec un certain style CSS et
lesquels.

Séquence d'utilisation basique typique dans votre code Python:

1. Importer la bibliothèque Beautiful Soup

2. Ouvrez une page Web ou un texte HTML avec la bibliothèque BeautifulSoup en mentionnant
quel analyseur utiliser. Le résultat de cette étape est un objet BeautifulSoup. (Remarque: ce
nom d’analyseur mentionné doit être déjà installé dans le cadre de vos processus Python.
Par exemple, html.parser est un package intégré avec piles fourni avec Python. Vous
pouvez installer d’autres analyseurs tels que lxml ou html5lib .)

3. "Requête" ou recherchez l'objet BeautifulSoup en utilisant la syntaxe 'object.method' et


obtenez le résultat dans une collection, telle qu'un dictionnaire Python. Pour certaines
méthodes, la sortie sera une valeur simple.

4. Utilisez le résultat de l'étape précédente pour faire ce que vous voulez en faire, en restant

https://riptutorial.com/fr/home 2
dans votre code Python. Vous pouvez également modifier les valeurs d'élément ou les
valeurs d'attribut dans l'objet d'arborescence. Les modifications n'affectent pas la source du
code html, mais vous pouvez appeler des méthodes de formatage de sortie (telles que
prettify ) pour créer une nouvelle sortie à partir de l'objet BeautifulSoup.

Méthodes couramment utilisées: Généralement, les méthodes .find et .find_all sont utilisées
pour rechercher l'arborescence, en donnant les arguments d'entrée.

Les arguments d'entrée sont les suivants: le nom de la balise recherchée, les noms des attributs
et d'autres arguments connexes. Ces arguments peuvent être présentés comme suit: une chaîne,
une expression régulière, une liste ou même une fonction.

Les utilisations courantes de l'objet BeautifulSoup incluent:

1. Recherche par classe CSS


2. Recherche par adresse de lien hypertexte
3. Recherche par identifiant d'élément, tag
4. Recherche par nom d'attribut. Valeur d'attribut.

Si vous avez besoin de filtrer l'arborescence avec une combinaison des critères ci-dessus, vous
pouvez également écrire une fonction qui a la valeur true ou false et rechercher par cette fonction.

Versions

Version Remarques Nom du paquet Date de sortie

3.x Version 3.2.1; Python 2 seulement beautifulsoup 2012-02-16

4.x Version 4.5.0; Python 2 et 3 beautifulsoup4 2016-07-20

Examples
Installation ou configuration

pip peut être utilisé pour installer BeautifulSoup. Pour installer la version 4 de BeautifulSoup,
exécutez la commande:

pip install beautifulsoup4

Sachez que le nom du package est beautifulsoup4 au lieu de beautifulsoup , ce dernier nom
signifie ancienne version, voir ancien beautifulsoup

Un exemple de grattage BeautifulSoup "Hello World"

from bs4 import BeautifulSoup


import requests

https://riptutorial.com/fr/home 3
main_url = "https://fr.wikipedia.org/wiki/Hello_world"
req = requests.get(main_url)
soup = BeautifulSoup(req.text, "html.parser")

# Finding the main title tag.


title = soup.find("h1", class_ = "firstHeading")
print title.get_text()

# Finding the mid-titles tags and storing them in a list.


mid_titles = [tag.get_text() for tag in soup.find_all("span", class_ = "mw-headline")]

# Now using css selectors to retrieve the article shortcut links


links_tags = soup.select("li.toclevel-1")
for tag in links_tags:
print tag.a.get("href")

# Retrieving the side page links by "blocks" and storing them in a dictionary
side_page_blocks = soup.find("div",
id = "mw-panel").find_all("div",
class_ = "portal")
blocks_links = {}
for num, block in enumerate(side_page_blocks):
blocks_links[num] = [link.get("href") for link in block.find_all("a", href = True)]

print blocks_links[0]

Sortie:

"Hello, World!" program


#Purpose
#History
#Variations
#See_also
#References
#External_links
[u'/wiki/Main_Page', u'/wiki/Portal:Contents', u'/wiki/Portal:Featured_content',
u'/wiki/Portal:Current_events', u'/wiki/Special:Random',
u'https://donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&u
u'//shop.wikimedia.org']

Entrer votre analyseur préféré lors de l'instanciation de Beautiful Soup évite l' Warning habituel
déclarant no parser was explicitely specified .

Différentes méthodes peuvent être utilisées pour trouver un élément dans l'arborescence de la
page Web.

Bien qu'il existe quelques autres méthodes, les CSS classes et les CSS selectors sont deux moyens
pratiques de rechercher des éléments dans l'arborescence.

Il convient de noter que nous pouvons rechercher des balises en définissant leur valeur d'attribut
sur True lors de la recherche.

get_text()nous permet de récupérer du texte contenu dans une balise. Il le renvoie sous la forme
d'une chaîne Unicode unique. tag.get("attribute") permet d'obtenir la valeur d'un attribut de tag.

Lire Commencer avec beautifulsoup en ligne:

https://riptutorial.com/fr/home 4
https://riptutorial.com/fr/beautifulsoup/topic/1817/commencer-avec-beautifulsoup

https://riptutorial.com/fr/home 5
Chapitre 2: Éléments de localisation
Examples
Localiser un texte après un élément dans BeautifulSoup

Imaginez que vous avez le code HTML suivant:

<div>
<label>Name:</label>
John Smith
</div>

Et vous devez localiser le texte "John Smith" après l'élément label .

Dans ce cas, vous pouvez localiser l'élément label par texte, puis utiliser la propriété .next_sibling
:

from bs4 import BeautifulSoup

data = """
<div>
<label>Name:</label>
John Smith
</div>
"""

soup = BeautifulSoup(data, "html.parser")

label = soup.find("label", text="Name:")


print(label.next_sibling.strip())

Imprime John Smith .

Utilisation de sélecteurs CSS pour localiser des éléments dans BeautifulSoup

BeautifulSoup a un support limité pour les sélecteurs CSS , mais couvre les plus couramment
utilisés. Utilisez la méthode select() pour rechercher plusieurs éléments et select_one() pour
rechercher un seul élément.

Exemple de base:

from bs4 import BeautifulSoup

data = """
<ul>
<li class="item">item1</li>
<li class="item">item2</li>
<li class="item">item3</li>
</ul>
"""

https://riptutorial.com/fr/home 6
soup = BeautifulSoup(data, "html.parser")

for item in soup.select("li.item"):


print(item.get_text())

Impressions:

item1
item2
item3

Localisation des commentaires

Pour localiser les commentaires dans BeautifulSoup , utilisez l'argument text (ou string dans les
versions récentes) vérifiant le type à Comment :

from bs4 import BeautifulSoup


from bs4 import Comment

data = """
<html>
<body>
<div>
<!-- desired text -->
</div>
</body>
</html>
"""

soup = BeautifulSoup(data, "html.parser")


comment = soup.find(text=lambda text: isinstance(text, Comment))
print(comment)

Imprime desired text .

Fonctions de filtrage

BeautifulSoup vous permet de filtrer les résultats en fournissant une fonction à find_all et à des
fonctions similaires. Cela peut être utile pour les filtres complexes ainsi que pour un outil de
réutilisation du code.

Utilisation de base
Définir une fonction qui prend un élément comme seul argument. La fonction doit retourner True si
l'argument correspond.

def has_href(tag):
'''Returns True for tags with a href attribute'''
return bool(tag.get("href"))

https://riptutorial.com/fr/home 7
soup.find_all(has_href) #find all elements with a href attribute
#equivilent using lambda:
soup.find_all(lambda tag: bool(tag.get("href")))

Un autre exemple qui trouve des balises avec une valeur href qui ne commence pas par

Fournir des arguments supplémentaires pour


filtrer les fonctions
Comme la fonction transmise à find_all ne peut prendre qu'un seul argument, il est parfois utile
de créer des "fabriques de fonctions" qui produisent des fonctions pouvant être utilisées dans
find_all . Ceci est utile pour rendre vos fonctions de recherche de tags plus flexibles.

def present_in_href(check_string):
return lambda tag: tag.get("href") and check_string in tag.get("href")

soup.find_all(present_in_href("/partial/path"))

Accès aux balises internes et à leurs attributs de la balise initialement


sélectionnée

Supposons que vous ayez un html après avoir sélectionné avec soup.find('div', class_='base
class') :

from bs4 import BeautifulSoup

soup = BeautifulSoup(SomePage, 'lxml')


html = soup.find('div', class_='base class')
print(html)

<div class="base class">


<div>Sample text 1</div>
<div>Sample text 2</div>
<div>
<a class="ordinary link" href="https://example.com">URL text</a>
</div>
</div>

<div class="Confusing class"></div>


'''

Et si vous voulez accéder à la balise <a> href , vous pouvez le faire de cette manière:

a_tag = html.a
link = a_tag['href']
print(link)

https://example.com

Ceci est utile lorsque vous ne pouvez pas sélectionner directement la balise <a> car ses attrs ne

https://riptutorial.com/fr/home 8
vous donnent pas d’identification unique, il existe d’autres balises <a> jumelées dans la page
analysée. Mais vous pouvez sélectionner de manière unique une balise parent contenant <a> .

Collecter des éléments facultatifs et / ou leurs attributs à partir de séries de


pages

Considérons la situation lorsque vous analysez le nombre de pages et que vous souhaitez
collecter la valeur de l'élément facultatif (peut être présenté sur une page et peut être absent sur
une autre) pour une page spécifique.

De plus, l'élément lui-même, par exemple, est l' élément le plus ordinaire de la page, c'est-à-dire
qu'aucun attribut spécifique ne peut le localiser de manière unique. Mais vous voyez que vous
pouvez sélectionner correctement son élément parent et que vous connaissez le numéro d'ordre
de l'élément souhaité dans le niveau d'imbrication correspondant.

from bs4 import BeautifulSoup

soup = BeautifulSoup(SomePage, 'lxml')


html = soup.find('div', class_='base class') # Below it refers to html_1 and html_2

L'élément recherché est facultatif, donc il pourrait y avoir 2 situations pour que html soit:

html_1 = '''
<div class="base class"> # №0
<div>Sample text 1</div> # №1
<div>Sample text 2</div> # №2
<div>!Needed text!</div> # №3
</div>

<div>Confusing div text</div> # №4


'''

html_2 = '''
<div class="base class"> # №0
<div>Sample text 1</div> # №1
<div>Sample text 2</div> # №2
</div>

<div>Confusing div text</div> # №4


'''

Si vous avez html_1 vous pouvez collecter du !Needed text! de tag №3 de cette façon:

wanted tag = html_1.div.find_next_sibling().find_next_sibling() # this gives you whole tag №3

Il obtient initialement №1 div , puis 2 fois passe au div suivant au même niveau d'imbrication pour
arriver à №3.

wanted_text = wanted_tag.text # extracting !Needed text!

Utilité de cette approche vient lorsque vous obtenez html_2 - approche ne vous donnera pas

https://riptutorial.com/fr/home 9
d'erreur, il ne donnera None :

print(html_2.div.find_next_sibling().find_next_sibling())
None

L'utilisation de find_next_sibling() est cruciale car elle limite la recherche d'éléments par niveau
d'imbrication respectif. Si vous utilisez find_next() balise №4 sera collectée et vous ne le
souhaitez pas:

print(html_2.div.find_next().find_next())
<div>Confusing div text</div>

Vous pouvez également explorer find_previous_sibling() et find_previous() qui fonctionnent de


manière find_previous() opposée.

Toutes les fonctions décrites ont leurs variantes multiples pour attraper toutes les balises, pas
seulement la première:

find_next_siblings()
find_previous_siblings()
find_all_next()
find_all_previous()

Lire Éléments de localisation en ligne: https://riptutorial.com/fr/beautifulsoup/topic/1940/elements-


de-localisation

https://riptutorial.com/fr/home 10
Crédits
S.
Chapitres Contributeurs
No

Commencer avec Antti Haapala, Community, Dair, DMPierre, Larry Cai, vikingben,
1
beautifulsoup Whirl Mind

Éléments de
2 alecxe, Dmitriy Fialkovskiy, sytech
localisation

https://riptutorial.com/fr/home 11

Vous aimerez peut-être aussi