Beautiful Soup - Modifica l'albero

Uno degli aspetti importanti di BeautifulSoup è la ricerca nell'albero di analisi e ti consente di apportare modifiche al documento Web in base alle tue esigenze. Possiamo apportare modifiche alle proprietà del tag usando i suoi attributi, come il metodo .name, .string o .append (). Ti consente di aggiungere nuovi tag e stringhe a un tag esistente con l'aiuto dei metodi .new_string () e .new_tag (). Esistono anche altri metodi, come .insert (), .insert_before () o .insert_after () per apportare varie modifiche al documento HTML o XML.

Modifica dei nomi e degli attributi dei tag

Dopo aver creato la zuppa, è facile apportare modifiche come rinominare il tag, apportare modifiche ai suoi attributi, aggiungere nuovi attributi ed eliminare attributi.

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

La modifica e l'aggiunta di nuovi attributi sono le seguenti:

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

L'eliminazione degli attributi è la seguente:

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

Modifica .string

Puoi facilmente modificare l'attributo .string del tag -

>>> 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>

Dall'alto, possiamo vedere se il tag contiene altri tag, questi e tutto il loro contenuto verranno sostituiti da nuovi dati.

aggiungere()

L'aggiunta di nuovi dati / contenuti a un tag esistente avviene utilizzando il metodo tag.append (). È molto simile al metodo append () nell'elenco 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 () e .new_tag ()

Nel caso in cui si desideri aggiungere una stringa a un documento, è possibile farlo facilmente utilizzando il costruttore append () o 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: Se trovi qualche errore di nome durante l'accesso alla funzione NavigableString (), come segue -

NameError: il nome "NavigableString" non è definito

Basta importare la directory NavigableString dal pacchetto bs4 -

>>> from bs4 import NavigableString

Possiamo risolvere l'errore di cui sopra.

Puoi aggiungere commenti ai tuoi tag esistenti o aggiungere qualche altra sottoclasse di NavigableString, basta chiamare il costruttore.

>>> 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'aggiunta di un tag completamente nuovo (non l'aggiunta a un tag esistente) può essere eseguita utilizzando il metodo integrato 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>

È richiesto solo il primo argomento, il nome del tag.

inserire()

Simile al metodo .insert () nell'elenco python, tag.insert () inserirà un nuovo elemento, tuttavia, a differenza di tag.append (), il nuovo elemento non va necessariamente alla fine del contenuto del suo genitore. Il nuovo elemento può essere aggiunto in qualsiasi posizione.

>>> 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 () e insert_after ()

Per inserire un tag o una stringa appena prima di qualcosa nell'albero di analisi, usiamo 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>

Allo stesso modo per inserire un tag o una stringa subito dopo qualcosa nell'albero di analisi, utilizzare 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']

chiaro()

Per rimuovere il contenuto di un tag, usa 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>

estratto()

Per rimuovere un tag o stringhe dall'albero, utilizzare 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

decomporsi()

Il tag.decompose () rimuove un tag dall'albero e cancella tutto il suo contenuto.

>>> 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>
>>>

Sostituirlo con()

Come suggerisce il nome, la funzione pageElement.replace_with () sostituirà il vecchio tag o stringa con il nuovo tag o stringa nell'albero -

>>> 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>

Nell'output precedente, hai notato che replace_with () restituisce il tag o la stringa che è stata sostituita (come "Material" nel nostro caso), quindi puoi esaminarla o aggiungerla di nuovo a un'altra parte dell'albero.

avvolgere ()

Il pageElement.wrap () racchiude un elemento nel tag specificato e restituisce un nuovo 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>

scartare()

Il tag.unwrap () è esattamente l'opposto di wrap () e sostituisce un tag con qualunque cosa all'interno di quel tag.

>>> 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>

Dall'alto, hai notato che come replace_with (), unfrap () restituisce il tag che è stato sostituito.

Di seguito è riportato un altro esempio di scartare () per capirlo meglio:

>>> 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>

Unrap () è utile per rimuovere il markup.