Belle soupe - Types d'objets

Lorsque nous avons passé un document ou une chaîne html à un constructeur beautifulsoup, beautifulsoup convertit essentiellement une page html complexe en différents objets python. Ci-dessous, nous allons discuter de quatre grands types d'objets:

  • Tag

  • NavigableString

  • BeautifulSoup

  • Comments

Objets de balise

Une balise HTML est utilisée pour définir différents types de contenu. Un objet de balise dans BeautifulSoup correspond à une balise HTML ou XML dans la page ou le document réel.

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<b class="boldest">TutorialsPoint</b>')
>>> tag = soup.html
>>> type(tag)
<class 'bs4.element.Tag'>

Les balises contiennent de nombreux attributs et méthodes et deux caractéristiques importantes d'une balise sont son nom et ses attributs.

Nom (tag.name)

Chaque balise contient un nom et est accessible via «.name» comme suffixe. tag.name renverra le type de tag dont il s'agit.

>>> tag.name
'html'

Cependant, si nous changeons le nom de la balise, cela se reflétera dans le balisage HTML généré par BeautifulSoup.

>>> tag.name = "Strong"
>>> tag
<Strong><body><b class="boldest">TutorialsPoint</b></body></Strong>
>>> tag.name
'Strong'

Attributs (tag.attrs)

Un objet balise peut avoir n'importe quel nombre d'attributs. La balise <b class = ”boldest”> a un attribut 'class' dont la valeur est “boldest”. Tout ce qui n'est PAS une balise est essentiellement un attribut et doit contenir une valeur. Vous pouvez accéder aux attributs soit en accédant aux clés (comme en accédant à «class» dans l'exemple ci-dessus), soit en accédant directement via «.attrs»

>>> tutorialsP = BeautifulSoup("<div class='tutorialsP'></div>",'lxml')
>>> tag2 = tutorialsP.div
>>> tag2['class']
['tutorialsP']

Nous pouvons faire toutes sortes de modifications aux attributs de notre balise (ajouter / supprimer / modifier).

>>> tag2['class'] = 'Online-Learning'
>>> tag2['style'] = '2007'
>>>
>>> tag2
<div class="Online-Learning" style="2007"></div>
>>> del tag2['style']
>>> tag2
<div class="Online-Learning"></div>
>>> del tag['class']
>>> tag
<b SecondAttribute="2">TutorialsPoint</b>
>>>
>>> del tag['SecondAttribute']
>>> tag
</b>
>>> tag2['class']
'Online-Learning'
>>> tag2['style']
KeyError: 'style'

Attributs à valeurs multiples

Certains des attributs HTML5 peuvent avoir plusieurs valeurs. Le plus couramment utilisé est l'attribut de classe qui peut avoir plusieurs valeurs CSS. D'autres incluent «rel», «rev», «headers», «accesskey» et «accept-charset». Les attributs à valeurs multiples dans une belle soupe sont affichés sous forme de liste.

>>> from bs4 import BeautifulSoup
>>>
>>> css_soup = BeautifulSoup('<p class="body"></p>')
>>> css_soup.p['class']
['body']
>>>
>>> css_soup = BeautifulSoup('<p class="body bold"></p>')
>>> css_soup.p['class']
['body', 'bold']

Cependant, si un attribut contient plus d'une valeur mais qu'il ne s'agit pas d'attributs à valeurs multiples par n'importe quelle version de la norme HTML, belle soupe laissera l'attribut seul -

>>> id_soup = BeautifulSoup('<p id="body bold"></p>')
>>> id_soup.p['id']
'body bold'
>>> type(id_soup.p['id'])
<class 'str'>

Vous pouvez consolider plusieurs valeurs d'attribut si vous transformez une balise en chaîne.

>>> rel_soup = BeautifulSoup("<p> tutorialspoint Main <a rel='Index'> Page</a></p>")
>>> rel_soup.a['rel']
['Index']
>>> rel_soup.a['rel'] = ['Index', ' Online Library, Its all Free']
>>> print(rel_soup.p)
<p> tutorialspoint Main <a rel="Index Online Library, Its all Free"> Page</a></p>

En utilisant 'get_attribute_list', vous obtenez une valeur qui est toujours une liste, une chaîne, indépendamment du fait qu'il s'agisse d'une multi-valeur ou non.

id_soup.p.get_attribute_list(‘id’)

Cependant, si vous analysez le document comme 'xml', il n'y a pas d'attribut à valeurs multiples -

>>> xml_soup = BeautifulSoup('<p class="body bold"></p>', 'xml')
>>> xml_soup.p['class']
'body bold'

NavigableString

L'objet navigablestring est utilisé pour représenter le contenu d'une balise. Pour accéder au contenu, utilisez «.string» avec balise.

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup("<h2 id='message'>Hello, Tutorialspoint!</h2>")
>>>
>>> soup.string
'Hello, Tutorialspoint!'
>>> type(soup.string)
>

Vous pouvez remplacer la chaîne par une autre chaîne, mais vous ne pouvez pas modifier la chaîne existante.

>>> soup = BeautifulSoup("<h2 id='message'>Hello, Tutorialspoint!</h2>")
>>> soup.string.replace_with("Online Learning!")
'Hello, Tutorialspoint!'
>>> soup.string
'Online Learning!'
>>> soup
<html><body><h2 id="message">Online Learning!</h2></body></html>

BeautifulSoup

BeautifulSoup est l'objet créé lorsque nous essayons de gratter une ressource Web. C'est donc le document complet que nous essayons de gratter. La plupart du temps, il est traité comme objet tag.

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup("<h2 id='message'>Hello, Tutorialspoint!</h2>")
>>> type(soup)
<class 'bs4.BeautifulSoup'>
>>> soup.name
'[document]'

commentaires

L'objet comment illustre la partie commentaire du document Web. C'est juste un type spécial de NavigableString.

>>> soup = BeautifulSoup('<p><!-- Everything inside it is COMMENTS --></p>')
>>> comment = soup.p.string
>>> type(comment)
<class 'bs4.element.Comment'>
>>> type(comment)
<class 'bs4.element.Comment'>
>>> print(soup.p.prettify())
<p>
<!-- Everything inside it is COMMENTS -->
</p>

Objets NavigableString

Les objets navigablestring sont utilisés pour représenter le texte dans les balises, plutôt que les balises elles-mêmes.