Schöne Suppe - Den Baum modifizieren

Einer der wichtigen Aspekte von BeautifulSoup ist die Suche im Analysebaum, mit der Sie Änderungen am Webdokument entsprechend Ihren Anforderungen vornehmen können. Wir können Änderungen an den Eigenschaften des Tags mithilfe seiner Attribute vornehmen, z. B. der Methode .name, .string oder .append (). Mithilfe der Methoden .new_string () und .new_tag () können Sie einem vorhandenen Tag neue Tags und Zeichenfolgen hinzufügen. Es gibt auch andere Methoden, z. B. .insert (), .insert_before () oder .insert_after (), um verschiedene Änderungen an Ihrem HTML- oder XML-Dokument vorzunehmen.

Tag-Namen und -Attribute ändern

Sobald Sie die Suppe erstellt haben, können Sie einfach Änderungen vornehmen, z. B. das Tag umbenennen, seine Attribute ändern, neue Attribute hinzufügen und Attribute löschen.

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

Das Ändern und Hinzufügen neuer Attribute erfolgt wie folgt:

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

Das Löschen von Attributen ist wie folgt:

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

.String ändern

Sie können das .string-Attribut des Tags einfach ändern.

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

Von oben können wir sehen, ob das Tag ein anderes Tag enthält. Sie und ihr gesamter Inhalt werden durch neue Daten ersetzt.

append ()

Das Hinzufügen neuer Daten / Inhalte zu einem vorhandenen Tag erfolgt mithilfe der tag.append () -Methode. Es ist der Methode append () in der Python-Liste sehr ähnlich.

>>> 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 () und .new_tag ()

Wenn Sie einem Dokument eine Zeichenfolge hinzufügen möchten, können Sie dies einfach mit dem Konstruktor append () oder NavigableString () tun.

>>> 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: Wenn Sie beim Zugriff auf die Funktion NavigableString () einen Namensfehler finden, gehen Sie wie folgt vor:

NameError: Der Name 'NavigableString' ist nicht definiert

Importieren Sie einfach das NavigableString-Verzeichnis aus dem bs4-Paket -

>>> from bs4 import NavigableString

Wir können den obigen Fehler beheben.

Sie können Kommentare zu Ihren vorhandenen Tags hinzufügen oder eine andere Unterklasse von NavigableString hinzufügen. Rufen Sie einfach den Konstruktor auf.

>>> 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!']

Das Hinzufügen eines ganz neuen Tags (das nicht an ein vorhandenes Tag angehängt wird) kann mit der in Beautifulsoup integrierten Methode BeautifulSoup.new_tag () - erfolgen.

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

Nur das erste Argument, der Tag-Name, ist erforderlich.

einfügen()

Ähnlich wie bei der Methode .insert () in der Python-Liste fügt tag.insert () ein neues Element ein. Im Gegensatz zu tag.append () steht das neue Element jedoch nicht unbedingt am Ende des Inhalts des übergeordneten Elements. Neues Element kann an jeder Position hinzugefügt werden.

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

Um ein Tag oder einen String kurz vor etwas in den Analysebaum einzufügen, verwenden wir 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>

Verwenden Sie insert_after (), um ein Tag oder eine Zeichenfolge direkt nach etwas im Analysebaum einzufügen.

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

klar()

Verwenden Sie tag.clear () -, um den Inhalt eines Tags zu entfernen.

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

Extrakt()

Verwenden Sie PageElement.extract (), um ein Tag oder Zeichenfolgen aus dem Baum zu entfernen.

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

zersetzen()

Die tag.decompose () entfernt ein Tag aus dem Baum und löscht seinen gesamten Inhalt.

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

Ersetzen mit()

Wie der Name schon sagt, ersetzt die Funktion pageElement.replace_with () das alte Tag oder die alte Zeichenfolge durch das neue Tag oder die neue Zeichenfolge im Baum.

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

In der obigen Ausgabe haben Sie festgestellt, dass replace_with () das Tag oder die Zeichenfolge zurückgibt, die ersetzt wurden (wie in unserem Fall „Material“), sodass Sie es untersuchen oder einem anderen Teil des Baums hinzufügen können.

wickeln()

Das pageElement.wrap () hat ein Element in das von Ihnen angegebene Tag eingeschlossen und gibt einen neuen Wrapper zurück -

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

auspacken()

Die Datei tag.unwrap () befindet sich genau gegenüber von wrap () und ersetzt ein Tag durch das, was sich in diesem Tag befindet.

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

Von oben haben Sie bemerkt, dass unwrap () wie replace_with () das ersetzte Tag zurückgibt.

Unten finden Sie ein weiteres Beispiel für unwrap (), um es besser zu verstehen -

>>> 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 () eignet sich zum Entfernen von Markups.