Piękna zupa - rodzaje przedmiotów

Kiedy przekazaliśmy dokument lub ciąg html do konstruktora beautifulsoup, beautifulsoup w zasadzie konwertuje złożoną stronę html na różne obiekty Pythona. Poniżej omówimy cztery główne rodzaje obiektów:

  • Tag

  • NavigableString

  • BeautifulSoup

  • Comments

Oznacz obiekty

Znacznik HTML służy do definiowania różnych typów treści. Obiekt znacznika w BeautifulSoup odpowiada znacznikowi HTML lub XML na rzeczywistej stronie lub dokumencie.

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

Tagi zawierają wiele atrybutów i metod, a dwie ważne cechy tagu to jego nazwa i atrybuty.

Nazwa (tag.name)

Każdy tag zawiera nazwę i jest dostępny poprzez rozszerzenie „.name” jako sufiks. tag.name zwróci typ tagu.

>>> tag.name
'html'

Jeśli jednak zmienimy nazwę tagu, to samo zostanie odzwierciedlone w znaczniku HTML wygenerowanym przez BeautifulSoup.

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

Atrybuty (tag.attrs)

Obiekt etykiety może mieć dowolną liczbę atrybutów. Znacznik <b class = ”boldest”> ma atrybut „class”, którego wartość to „boldest”. Wszystko, co NIE jest tagiem, jest w zasadzie atrybutem i musi zawierać wartość. Dostęp do atrybutów można uzyskać, uzyskując dostęp do kluczy (np. Uzyskując dostęp do „klasy” w powyższym przykładzie) lub bezpośrednio przez „.attrs”

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

Możemy dokonać wszelkiego rodzaju modyfikacji atrybutów naszego tagu (dodaj / usuń / zmodyfikuj).

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

Atrybuty wielowartościowe

Niektóre atrybuty HTML5 mogą mieć wiele wartości. Najczęściej używany jest atrybut-klasa, który może mieć wiele wartości CSS. Inne to „rel”, „rev”, „headers”, „accesskey” i „accept-charset”. Wielowartościowe atrybuty pięknej zupy są pokazane jako lista.

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

Jeśli jednak jakikolwiek atrybut zawiera więcej niż jedną wartość, ale nie jest atrybutem wielowartościowym w żadnej wersji standardu HTML, piękna zupa pozostawi ten atrybut w spokoju -

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

Możesz skonsolidować wiele wartości atrybutów, jeśli zmienisz tag w ciąg.

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

Używając „get_attribute_list”, otrzymujesz wartość, która zawsze jest listą, ciągiem znaków, niezależnie od tego, czy jest to wielowartościowa, czy nie.

id_soup.p.get_attribute_list(‘id’)

Jeśli jednak przeanalizujesz dokument jako „xml”, nie ma atrybutów wielowartościowych -

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

NavigableString

Obiekt navigablestring służy do reprezentowania zawartości znacznika. Aby uzyskać dostęp do zawartości, użyj „.string” z tagiem.

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

Możesz zamienić ciąg na inny, ale nie możesz edytować istniejącego.

>>> 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 to obiekt tworzony, gdy próbujemy zeskrobać zasób sieciowy. Jest to więc cały dokument, który próbujemy zeskrobać. W większości przypadków jest to obiekt typu tag.

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

Komentarze

Obiekt komentarza ilustruje część dokumentu WWW zawierającą komentarz. To po prostu specjalny typ 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>

NavigableString Objects

Obiekty nawigacyjne służą do reprezentowania tekstu w znacznikach, a nie samych znaczników.