Bela sopa - tipos de objetos

Quando passamos um documento html ou string para um construtor beautifulsoup, beautifulsoup basicamente converte uma página html complexa em diferentes objetos python. Abaixo, vamos discutir quatro tipos principais de objetos:

  • Tag

  • NavigableString

  • BeautifulSoup

  • Comments

Objetos de Tag

Uma tag HTML é usada para definir vários tipos de conteúdo. Um objeto de tag no BeautifulSoup corresponde a uma tag HTML ou XML na página ou documento real.

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

As tags contêm muitos atributos e métodos e dois recursos importantes de uma tag são seu nome e atributos.

Nome (tag.name)

Cada tag contém um nome e pode ser acessada por meio de '.name' como sufixo. tag.name retornará o tipo de tag que é.

>>> tag.name
'html'

Porém, se alterarmos o nome da tag, o mesmo será refletido na marcação HTML gerada pelo BeautifulSoup.

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

Atributos (tag.attrs)

Um objeto de tag pode ter qualquer número de atributos. A tag <b class = ”boldest”> possui um atributo 'class' cujo valor é “boldest”. Qualquer coisa que NÃO seja tag é basicamente um atributo e deve conter um valor. Você pode acessar os atributos acessando as chaves (como acessar “classe” no exemplo acima) ou acessando diretamente por meio de “.attrs”

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

Podemos fazer todo tipo de modificação nos atributos de nossa tag (adicionar / remover / modificar).

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

Atributos com vários valores

Alguns dos atributos HTML5 podem ter vários valores. Mais comumente usado é o atributo de classe, que pode ter vários valores CSS. Outros incluem 'rel', 'rev', 'headers', 'accesskey' e 'accept-charset'. Os atributos de vários valores em uma sopa bonita são mostrados como uma 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']

No entanto, se qualquer atributo contiver mais de um valor, mas não for atributos com vários valores por qualquer versão do padrão HTML, a bela sopa deixará o atributo sozinho -

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

Você pode consolidar vários valores de atributo se transformar uma tag em uma string.

>>> 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', você obtém um valor que é sempre uma lista, string, independentemente de ser um valor múltiplo ou não.

id_soup.p.get_attribute_list(‘id’)

No entanto, se você analisar o documento como 'xml', não haverá atributos com vários valores -

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

NavigableString

O objeto navigablestring é usado para representar o conteúdo de uma tag. Para acessar o conteúdo, use “.string” com tag.

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

Você pode substituir a string por outra string, mas não pode editar a string existente.

>>> 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 é o objeto criado quando tentamos extrair um recurso da web. Portanto, é o documento completo que estamos tentando raspar. Na maioria das vezes, é um objeto de tag tratado.

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

Comentários

O objeto de comentário ilustra a parte do comentário do documento da web. É apenas um tipo especial de 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>

Objetos NavigableString

Os objetos navigablestring são usados ​​para representar texto dentro de tags, em vez das próprias tags.