Beautiful Soup - Modificando el árbol
Uno de los aspectos importantes de BeautifulSoup es buscar en el árbol de análisis y le permite realizar cambios en el documento web de acuerdo con sus requisitos. Podemos realizar cambios en las propiedades de la etiqueta usando sus atributos, como el método .name, .string o .append (). Le permite agregar nuevas etiquetas y cadenas a una etiqueta existente con la ayuda de los métodos .new_string () y .new_tag (). También hay otros métodos, como .insert (), .insert_before () o .insert_after () para realizar varias modificaciones en su documento HTML o XML.
Cambiar los nombres y atributos de las etiquetas
Una vez que haya creado la sopa, es fácil realizar modificaciones como cambiar el nombre de la etiqueta, realizar modificaciones en sus atributos, agregar nuevos atributos y eliminar atributos.
>>> soup = BeautifulSoup('<b class="bolder">Very Bold</b>')
>>> tag = soup.b
La modificación y la adición de nuevos atributos son las siguientes:
>>> tag.name = 'Blockquote'
>>> tag['class'] = 'Bolder'
>>> tag['id'] = 1.1
>>> tag
<Blockquote class="Bolder" id="1.1">Very Bold</Blockquote>
La eliminación de atributos es la siguiente:
>>> del tag['class']
>>> tag
<Blockquote id="1.1">Very Bold</Blockquote>
>>> del tag['id']
>>> tag
<Blockquote>Very Bold</Blockquote>
Modificar .string
Puede modificar fácilmente el atributo .string de la etiqueta:
>>> 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>
Desde arriba, podemos ver si la etiqueta contiene alguna otra etiqueta, ellos y todo su contenido serán reemplazados por nuevos datos.
adjuntar()
La adición de nuevos datos / contenidos a una etiqueta existente se realiza mediante el método tag.append (). Es muy similar al método append () en la lista de Python.
>>> 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 () y .new_tag ()
En caso de que desee agregar una cadena a un documento, esto se puede hacer fácilmente usando el constructor append () o 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: Si encuentra algún error de nombre al acceder a la función NavigableString (), de la siguiente manera:
NameError: el nombre 'NavigableString' no está definido
Simplemente importe el directorio NavigableString del paquete bs4 -
>>> from bs4 import NavigableString
Podemos resolver el error anterior.
Puede agregar comentarios a sus etiquetas existentes o puede agregar alguna otra subclase de NavigableString, simplemente llame al constructor.
>>> 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!']
Se puede agregar una etiqueta completamente nueva (no agregar a una etiqueta existente) usando el método incorporado de 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>
Solo se requiere el primer argumento, el nombre de la etiqueta.
insertar()
Similar al método .insert () en la lista de Python, tag.insert () insertará un nuevo elemento sin embargo, a diferencia de tag.append (), el nuevo elemento no necesariamente va al final del contenido del padre. Se puede agregar un nuevo elemento en cualquier posición.
>>> 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 () y insert_after ()
Para insertar alguna etiqueta o cadena justo antes de algo en el árbol de análisis, usamos 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>
De manera similar, para insertar alguna etiqueta o cadena justo después de algo en el árbol de análisis, use 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']
claro()
Para eliminar el contenido de una etiqueta, use 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>
extraer()
Para eliminar una etiqueta o cadenas del árbol, use 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
descomponer()
Tag.decompose () elimina una etiqueta del árbol y elimina todo su contenido.
>>> 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>
>>>
Reemplazar con()
Como sugiere el nombre, la función pageElement.replace_with () reemplazará la etiqueta o cadena anterior con la nueva etiqueta o cadena en el árbol -
>>> 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>
En la salida anterior, ha notado que replace_with () devuelve la etiqueta o cadena que fue reemplazada (como "Material" en nuestro caso), por lo que puede examinarla o agregarla nuevamente a otra parte del árbol.
envolver()
PageElement.wrap () incluyó un elemento en la etiqueta que especificó y devuelve un nuevo contenedor:
>>> 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>
desenvolver()
El tag.unwrap () está justo enfrente de wrap () y reemplaza una etiqueta con lo que sea dentro de esa etiqueta.
>>> 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>
Desde arriba, ha notado que como replace_with (), desenvolver () devuelve la etiqueta que fue reemplazada.
A continuación se muestra un ejemplo más de desenvolver () para comprenderlo mejor:
>>> 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>
desenvolver () es bueno para eliminar el marcado.