Piękna zupa - modyfikacja drzewa
Jednym z ważnych aspektów BeautifulSoup jest przeszukiwanie drzewa parsowania i umożliwia wprowadzanie zmian w dokumencie sieciowym zgodnie z wymaganiami. Możemy dokonywać zmian we właściwościach tagu za pomocą jego atrybutów, takich jak metoda .name, .string czy .append (). Pozwala na dodawanie nowych znaczników i ciągów do istniejącego znacznika za pomocą metod .new_string () i .new_tag (). Istnieją również inne metody, takie jak .insert (), .insert_before () lub .insert_after (), służące do wprowadzania różnych modyfikacji w dokumencie HTML lub XML.
Zmiana nazw i atrybutów znaczników
Po utworzeniu zupy łatwo jest dokonać modyfikacji, takich jak zmiana nazwy tagu, modyfikacja jego atrybutów, dodawanie nowych atrybutów i usuwanie atrybutów.
>>> soup = BeautifulSoup('<b class="bolder">Very Bold</b>')
>>> tag = soup.b
Modyfikacje i dodawanie nowych atrybutów są następujące -
>>> tag.name = 'Blockquote'
>>> tag['class'] = 'Bolder'
>>> tag['id'] = 1.1
>>> tag
<Blockquote class="Bolder" id="1.1">Very Bold</Blockquote>
Usuwanie atrybutów jest następujące -
>>> del tag['class']
>>> tag
<Blockquote id="1.1">Very Bold</Blockquote>
>>> del tag['id']
>>> tag
<Blockquote>Very Bold</Blockquote>
Modyfikowanie .string
Możesz łatwo zmodyfikować atrybut .string tagu -
>>> 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>
Z góry możemy zobaczyć, czy tag zawiera inny tag, on i cała ich zawartość zostaną zastąpione nowymi danymi.
dodać()
Dodanie nowych danych / treści do istniejącego tagu odbywa się za pomocą metody tag.append (). Jest bardzo podobny do metody append () na liście Pythona.
>>> 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 () i .new_tag ()
W przypadku, gdy chcesz dodać ciąg do dokumentu, można to łatwo zrobić za pomocą konstruktora append () lub 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: Jeśli znajdziesz jakąkolwiek nazwę Błąd podczas uzyskiwania dostępu do funkcji NavigableString (), wykonaj następujące czynności:
NameError: nazwa „NavigableString” nie jest zdefiniowana
Po prostu zaimportuj katalog NavigableString z pakietu bs4 -
>>> from bs4 import NavigableString
Możemy rozwiązać powyższy błąd.
Możesz dodać komentarze do istniejącego tagu lub możesz dodać inną podklasę NavigableString, po prostu wywołaj konstruktora.
>>> 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!']
Dodanie całego nowego tagu (bez dołączania do istniejącego tagu) można wykonać za pomocą wbudowanej metody 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>
Wymagany jest tylko pierwszy argument, nazwa tagu.
wstawić()
Podobnie jak w przypadku metody .insert () na liście Pythona, tag.insert () wstawi nowy element, jednak w przeciwieństwie do tag.append (), nowy element niekoniecznie musi znajdować się na końcu zawartości swojego rodzica. Nowy element można dodać w dowolnym miejscu.
>>> 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 () i insert_after ()
Aby wstawić jakiś znacznik lub ciąg tuż przed czymś w drzewie parsowania, używamy 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>
Podobnie, aby wstawić jakiś znacznik lub ciąg zaraz za czymś w drzewie parsowania, użyj 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']
jasny()
Aby usunąć zawartość tagu, użyj 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>
wyciąg()
Aby usunąć tag lub ciągi z drzewa, użyj 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
rozkładać się()
Tag.decompose () usuwa tag z drzewa i całą jego zawartość.
>>> 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>
>>>
Zamienić()
Jak sama nazwa wskazuje, funkcja pageElement.replace_with () zastąpi stary tag lub ciąg nowym tagiem lub ciągiem w drzewie -
>>> 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>
Na powyższym wyjściu zauważyłeś, że replace_with () zwraca tag lub ciąg, który został zastąpiony (jak „Materiał” w naszym przypadku), więc możesz go zbadać lub dodać z powrotem do innej części drzewa.
owinąć()
Metoda pageElement.wrap () ujęła element w określonym tagu i zwraca nowe opakowanie -
>>> 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>
rozwijać()
Tag.unwrap () jest przeciwieństwem metody wrap () i zastępuje tag tym, co znajduje się wewnątrz tego tagu.
>>> 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>
Z góry zauważyłeś, że podobnie jak replace_with (), unrap () zwraca tag, który został zastąpiony.
Poniżej znajduje się jeszcze jeden przykład unrap (), aby lepiej to zrozumieć -
>>> 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 () jest dobre do usuwania znaczników.