Beautiful Soup - Tipi di oggetti

Quando passiamo un documento html o una stringa a un costruttore di beautifulsoup, beautifulsoup converte fondamentalmente una pagina html complessa in diversi oggetti Python. Di seguito discuteremo quattro tipi principali di oggetti:

  • Tag

  • NavigableString

  • BeautifulSoup

  • Comments

Oggetti tag

Un tag HTML viene utilizzato per definire vari tipi di contenuto. Un oggetto tag in BeautifulSoup corrisponde a un tag HTML o XML nella pagina o nel documento effettivo.

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

I tag contengono molti attributi e metodi e due importanti caratteristiche di un tag sono il nome e gli attributi.

Nome (tag.name)

Ogni tag contiene un nome ed è possibile accedervi tramite ".name" come suffisso. tag.name restituirà il tipo di tag che è.

>>> tag.name
'html'

Tuttavia, se cambiamo il nome del tag, lo stesso si rifletterà nel markup HTML generato da BeautifulSoup.

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

Attributi (tag.attrs)

Un oggetto tag può avere un numero qualsiasi di attributi. Il tag <b class = "boldest"> ha un attributo "class" il cui valore è "boldest". Tutto ciò che NON è tag, è fondamentalmente un attributo e deve contenere un valore. Puoi accedere agli attributi sia accedendo alle chiavi (come l'accesso a "class" nell'esempio sopra) o accedendo direttamente tramite ".attrs"

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

Possiamo apportare tutti i tipi di modifiche agli attributi del nostro tag (aggiungi / rimuovi / modifica).

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

Attributi multivalore

Alcuni degli attributi HTML5 possono avere più valori. Il più comunemente usato è l'attributo di classe che può avere più valori CSS. Altri includono "rel", "rev", "headers", "accesskey" e "accept-charset". Gli attributi multivalore in una bella zuppa sono mostrati come elenco.

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

Tuttavia, se un attributo contiene più di un valore ma non è un attributo multivalore da nessuna versione dello standard HTML, la bella zuppa lascerà l'attributo da solo -

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

È possibile consolidare più valori di attributo se si trasforma un tag in una stringa.

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

Usando 'get_attribute_list', ottieni un valore che è sempre un elenco, una stringa, indipendentemente dal fatto che sia multivalore o meno.

id_soup.p.get_attribute_list(‘id’)

Tuttavia, se analizzi il documento come "xml", non ci sono attributi multivalore -

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

NavigableString

L'oggetto navigablestring viene utilizzato per rappresentare il contenuto di un tag. Per accedere ai contenuti, utilizzare ".string" con tag.

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

Puoi sostituire la stringa con un'altra stringa ma non puoi modificare la stringa esistente.

>>> 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 è l'oggetto creato quando proviamo a raschiare una risorsa web. Quindi, è il documento completo che stiamo cercando di raschiare. Il più delle volte, viene trattato come oggetto tag.

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

Commenti

L'oggetto commento illustra la parte commento del documento Web. È solo un tipo speciale di 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>

Oggetti NavigableString

Gli oggetti navigablestring vengono utilizzati per rappresentare il testo all'interno dei tag, piuttosto che i tag stessi.