Beautiful Soup - Modifier l'arbre

L'un des aspects importants de BeautifulSoup est la recherche dans l'arborescence d'analyse et vous permet d'apporter des modifications au document Web en fonction de vos besoins. Nous pouvons apporter des modifications aux propriétés de la balise en utilisant ses attributs, tels que la méthode .name, .string ou .append (). Il vous permet d'ajouter de nouvelles balises et chaînes à une balise existante à l'aide des méthodes .new_string () et .new_tag (). Il existe également d'autres méthodes, telles que .insert (), .insert_before () ou .insert_after () pour apporter diverses modifications à votre document HTML ou XML.

Modification des noms et des attributs des balises

Une fois que vous avez créé la soupe, il est facile de faire des modifications comme renommer la balise, apporter des modifications à ses attributs, ajouter de nouveaux attributs et supprimer des attributs.

>>> soup = BeautifulSoup('<b class="bolder">Very Bold</b>')
>>> tag = soup.b

La modification et l'ajout de nouveaux attributs sont les suivants -

>>> tag.name = 'Blockquote'
>>> tag['class'] = 'Bolder'
>>> tag['id'] = 1.1
>>> tag
<Blockquote class="Bolder" id="1.1">Very Bold</Blockquote>

La suppression des attributs est la suivante -

>>> del tag['class']
>>> tag
<Blockquote id="1.1">Very Bold</Blockquote>
>>> del tag['id']
>>> tag
<Blockquote>Very Bold</Blockquote>

Modifier .string

Vous pouvez facilement modifier l'attribut .string de la balise -

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">Must for every <i>Learner>/i<</a>'
>>> Bsoup = BeautifulSoup(markup)
>>> tag = Bsoup.a
>>> tag.string = "My Favourite spot."
>>> tag
<a href="https://www.tutorialspoint.com/index.htm">My Favourite spot.</a>

D'en haut, nous pouvons voir si la balise contient une autre balise, elle et tout son contenu seront remplacés par de nouvelles données.

ajouter()

L'ajout de nouvelles données / contenus à une balise existante se fait à l'aide de la méthode tag.append (). Elle est très similaire à la méthode append () dans la liste Python.

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">Must for every <i>Learner</i></a>'
>>> Bsoup = BeautifulSoup(markup)
>>> Bsoup.a.append(" Really Liked it")
>>> Bsoup
<html><body><a href="https://www.tutorialspoint.com/index.htm">Must for every <i>Learner</i> Really Liked it</a></body></html>
>>> Bsoup.a.contents
['Must for every ', <i>Learner</i>, ' Really Liked it']

NavigableString () et .new_tag ()

Si vous souhaitez ajouter une chaîne à un document, cela peut être fait facilement en utilisant le constructeur append () ou par NavigableString () -

>>> soup = BeautifulSoup("<b></b>")
>>> tag = soup.b
>>> tag.append("Start")
>>>
>>> new_string = NavigableString(" Your")
>>> tag.append(new_string)
>>> tag
<b>Start Your</b>
>>> tag.contents
['Start', ' Your']

Note: Si vous trouvez une erreur de nom lors de l'accès à la fonction NavigableString (), comme suit -

NameError: le nom 'NavigableString' n'est pas défini

Importez simplement le répertoire NavigableString du package bs4 -

>>> from bs4 import NavigableString

Nous pouvons résoudre l'erreur ci-dessus.

Vous pouvez ajouter des commentaires à vos balises existantes ou ajouter une autre sous-classe de NavigableString, appelez simplement le constructeur.

>>> from bs4 import Comment
>>> adding_comment = Comment("Always Learn something Good!")
>>> tag.append(adding_comment)
>>> tag
<b>Start Your<!--Always Learn something Good!--></b>
>>> tag.contents
['Start', ' Your', 'Always Learn something Good!']

L'ajout d'une toute nouvelle balise (sans l'ajouter à une balise existante) peut être fait en utilisant la méthode intégrée de Beautifulsoup, BeautifulSoup.new_tag () -

>>> soup = BeautifulSoup("<b></b>")
>>> Otag = soup.b
>>>
>>> Newtag = soup.new_tag("a", href="https://www.tutorialspoint.com")
>>> Otag.append(Newtag)
>>> Otag
<b><a href="https://www.tutorialspoint.com"></a></b>

Seul le premier argument, le nom de la balise, est requis.

insérer()

Similaire à la méthode .insert () sur la liste python, tag.insert () insérera un nouvel élément cependant, contrairement à tag.append (), le nouvel élément ne va pas nécessairement à la fin du contenu de son parent. Un nouvel élément peut être ajouté à n'importe quelle position.

>>> markup = '<a href="https://www.djangoproject.com/community/">Django Official website <i>Huge Community base</i></a>'
>>> soup = BeautifulSoup(markup)
>>> tag = soup.a
>>>
>>> tag.insert(1, "Love this framework ")
>>> tag
<a href="https://www.djangoproject.com/community/">Django Official website Love this framework <i>Huge Community base</i></a>
>>> tag.contents
['Django Official website ', 'Love this framework ', <i>Huge Community base</i
>]
>>>

insert_before () et insert_after ()

Pour insérer une balise ou une chaîne juste avant quelque chose dans l'arborescence d'analyse, nous utilisons insert_before () -

>>> soup = BeautifulSoup("Brave")
>>> tag = soup.new_tag("i")
>>> tag.string = "Be"
>>>
>>> soup.b.string.insert_before(tag)
>>> soup.b
<b><i>Be</i>Brave</b>

De même pour insérer une balise ou une chaîne juste après quelque chose dans l'arborescence d'analyse, utilisez insert_after ().

>>> soup.b.i.insert_after(soup.new_string(" Always "))
>>> soup.b
<b><i>Be</i> Always Brave</b>
>>> soup.b.contents
[<i>Be</i>, ' Always ', 'Brave']

clair()

Pour supprimer le contenu d'une balise, utilisez tag.clear () -

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">For <i>technical & Non-technical&lr;/i> Contents</a>'
>>> soup = BeautifulSoup(markup)
>>> tag = soup.a
>>> tag
<a href="https://www.tutorialspoint.com/index.htm">For <i>technical & Non-technical</i> Contents</a>
>>>
>>> tag.clear()
>>> tag
<a href="https://www.tutorialspoint.com/index.htm"></a>

extrait()

Pour supprimer une balise ou des chaînes de l'arborescence, utilisez PageElement.extract ().

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">For <i&gr;technical & Non-technical</i> Contents</a>'
>>> soup = BeautifulSoup(markup)
>>> a_tag = soup.a
>>>
>>> i_tag = soup.i.extract()
>>>
>>> a_tag
<a href="https://www.tutorialspoint.com/index.htm">For Contents</a>
>>>
>>> i_tag
<i>technical & Non-technical</i>
>>>
>>> print(i_tag.parent)
None

décomposer()

Le tag.decompose () supprime une balise de l'arborescence et supprime tout son contenu.

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">For <i>technical & Non-technical</i> Contents</a>'
>>> soup = BeautifulSoup(markup)
>>> a_tag = soup.a
>>> a_tag
<a href="https://www.tutorialspoint.com/index.htm">For <i>technical & Non-technical</i> Contents</a>
>>>
>>> soup.i.decompose()
>>> a_tag
<a href="https://www.tutorialspoint.com/index.htm">For Contents</a>
>>>

Remplacer par()

Comme son nom l'indique, la fonction pageElement.replace_with () remplacera l'ancienne balise ou chaîne par la nouvelle balise ou chaîne dans l'arborescence -

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">Complete Python <i>Material</i></a>'
>>> soup = BeautifulSoup(markup)
>>> a_tag = soup.a
>>>
>>> new_tag = soup.new_tag("Official_site")
>>> new_tag.string = "https://www.python.org/"
>>> a_tag.i.replace_with(new_tag)
<i>Material</i>
>>>
>>> a_tag
<a href="https://www.tutorialspoint.com/index.htm">Complete Python <Official_site>https://www.python.org/</Official_site></a>

Dans la sortie ci-dessus, vous avez remarqué que replace_with () renvoie la balise ou la chaîne qui a été remplacée (comme «Material» dans notre cas), vous pouvez donc l'examiner ou l'ajouter à une autre partie de l'arbre.

emballage()

La pageElement.wrap () a inclus un élément dans la balise que vous spécifiez et retourne un nouveau wrapper -

>>> soup = BeautifulSoup("<p>tutorialspoint.com</p>")
>>> soup.p.string.wrap(soup.new_tag("b"))
<b>tutorialspoint.com</b>
>>>
>>> soup.p.wrap(soup.new_tag("Div"))
<Div><p><b>tutorialspoint.com</b></p></Div>

déballer()

La balise tag.unwrap () est juste l'opposé de wrap () et remplace une balise par ce qui se trouve à l'intérieur de cette balise.

>>> soup = BeautifulSoup('<a href="https://www.tutorialspoint.com/">I liked <i>tutorialspoint</i></a>')
>>> a_tag = soup.a
>>>
>>> a_tag.i.unwrap()
<i></i>
>>> a_tag
<a href="https://www.tutorialspoint.com/">I liked tutorialspoint</a>

D'en haut, vous avez remarqué que comme replace_with (), unwrap () renvoie la balise qui a été remplacée.

Vous trouverez ci-dessous un autre exemple de unwrap () pour mieux le comprendre -

>>> soup = BeautifulSoup("<p>I <strong>AM</strong> a <i>text</i>.</p>")
>>> soup.i.unwrap()
<i></i>
>>> soup
<html><body><p>I <strong>AM</strong> a text.</p></body></html>

unwrap () est bon pour supprimer le balisage.