Beautiful Soup - Tipos de objetos

Cuando pasamos un documento html o una cadena a un constructor de beautifulsoup, beautifulsoup básicamente convierte una página html compleja en diferentes objetos de Python. A continuación, analizaremos cuatro tipos principales de objetos:

  • Tag

  • NavigableString

  • BeautifulSoup

  • Comments

Etiquetar objetos

Se utiliza una etiqueta HTML para definir varios tipos de contenido. Un objeto de etiqueta en BeautifulSoup corresponde a una etiqueta HTML o XML en la página o documento real.

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

Las etiquetas contienen muchos atributos y métodos y dos características importantes de una etiqueta son su nombre y atributos.

Nombre (tag.name)

Cada etiqueta contiene un nombre y se puede acceder a través de '.name' como sufijo. tag.name devolverá el tipo de etiqueta que es.

>>> tag.name
'html'

Sin embargo, si cambiamos el nombre de la etiqueta, lo mismo se reflejará en el marcado HTML generado por BeautifulSoup.

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

Atributos (tag.attrs)

Un objeto de etiqueta puede tener cualquier número de atributos. La etiqueta <b class = ”negrita”> tiene un atributo 'clase' cuyo valor es “negrita”. Todo lo que NO sea una etiqueta, es básicamente un atributo y debe contener un valor. Puede acceder a los atributos mediante el acceso a las claves (como el acceso a "clase" en el ejemplo anterior) o directamente mediante ".attrs"

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

Podemos hacer todo tipo de modificaciones a los atributos de nuestra etiqueta (agregar / quitar / 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 de varios valores

Algunos de los atributos de HTML5 pueden tener varios valores. El más utilizado es el atributo de clase, que puede tener varios valores CSS. Otros incluyen 'rel', 'rev', 'headers', 'accesskey' y 'accept-charset'. Los atributos de múltiples valores en la sopa hermosa se muestran como 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']

Sin embargo, si algún atributo contiene más de un valor pero no es un atributo de varios valores según ninguna versión del estándar HTML, beautiful soup dejará el atributo solo

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

Puede consolidar varios valores de atributos si convierte una etiqueta en una cadena.

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

Al usar 'get_attribute_list', obtiene un valor que siempre es una lista, una cadena, independientemente de si es de varios valores o no.

id_soup.p.get_attribute_list(‘id’)

Sin embargo, si analiza el documento como 'xml', no hay atributos de varios valores:

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

NavigableString

El objeto navigablestring se utiliza para representar el contenido de una etiqueta. Para acceder a los contenidos, utilice ".string" con etiqueta.

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

Puede reemplazar la cadena con otra cadena, pero no puede editar la cadena 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>

Hermosa Sopa

BeautifulSoup es el objeto creado cuando intentamos extraer un recurso web. Entonces, es el documento completo el que estamos tratando de raspar. La mayoría de las veces, se trata de un objeto de etiqueta.

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

Comentarios

El objeto de comentario ilustra la parte de comentario del documento web. Es solo un 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

Los objetos de cadena de navegación se utilizan para representar texto dentro de etiquetas, en lugar de las etiquetas en sí mismas.