BeautifulSoup es un paquete de Python que se usa para analizar documentos HTML y XML, crea un árbol de análisis para páginas analizadas que se puede usar para raspado web, extrae datos de archivos HTML y XML y trabaja con su analizador favorito para proporcionar la forma idiomática de navegar , buscando y modificando el árbol de análisis.
Instalación
Este módulo no viene integrado con Python. Para instalar este tipo, escriba el siguiente comando en la terminal.
pip install bs4
Navegación con BeautifulSoup
A continuación, el fragmento de código es el documento HTML que usaremos para navegar usando las etiquetas BeautifulSoup con este fragmento de código como referencia.
Python3
ht_doc = """ <html><head><title>Geeks For Geeks</title></head> <body> <p class="title"><b>most viewed courses in GFG,its all free</b></p> <p class ="prog">Top 5 Popular Programming Languages</p> <a href="https://www.geeksforgeeks.org/java-programming-examples/" \ class="prog" id="link1">Java</a> <a href="https://www.geeksforgeeks.org/cc-programs/" class="prog" \ id="link2">c/c++</a> <a href="https://www.geeksforgeeks.org/python-programming-examples/"\ class="prog" id="link3">Python</a> <a href="https://https://www.geeksforgeeks.org/introduction-to-javascript/"\ class="prog" id="link4">Javascript</a> <a href="https://www.geeksforgeeks.org/ruby-programming-language/" \ class="prog" id="link5">Ruby</a> <p>according to an online survey. </p> <p class="prog"> Programming Languages</p> </body></html> """
Ahora naveguemos de todas las formas posibles aplicando BeautifulSoup en Python en el fragmento de código anterior, el componente más importante en los documentos Html son las etiquetas que también pueden contener otras etiquetas/strings (elementos secundarios de la etiqueta). BeautifulSoup proporciona diferentes formas de iterar sobre estos niños, veamos todos los casos posibles
Navegando hacia abajo
Navegación usando nombres de etiquetas:
Ejemplo 1: Para obtener Head Tag.
Use .head para el objeto BeautifulSoup para obtener la etiqueta de cabeza en el documento HTML.
Sintaxis: (Variable BeautifulSoup).head
Ejemplo 2: para obtener la etiqueta de título
Use la etiqueta .title para recuperar el título del documento HTML incrustado en la variable BeautifulSoup
Sintaxis: (Variable BeautifulSoup).título
Código:
Python3
soup = BeautifulSoup(ht_doc, 'html.parser') print(soup.head) print(soup.title)
Producción:
<head><title>Geeks For Geeks</title></head> <title>Geeks For Geeks</title>
Ejemplo 3: Para obtener una etiqueta específica.
Podemos recuperar algunas etiquetas específicas como la primera etiqueta <b> en la etiqueta del cuerpo
Sintaxis: (Variable BeautifulSoup).body.b
El uso del nombre de la etiqueta como atributo le dará el primer nombre de ese nombre
Sintaxis: (Variable BeautifulSoup).(atributo de etiqueta)
Al usar find_all, podemos obtener todos los contenidos asociados con el atributo
Sintaxis: (Variable BeautifulSoup).find_all(valor de etiqueta)
Código:
Python3
soup = BeautifulSoup(ht_doc, 'html.parser') # retrieving b tag element print(soup.body.b) # retrieving a tag element from BeautifulSoup assigned variable print(soup.a) # retrieving all elements tagged with a in ht_doc print(soup.find_all("a"))
Producción:
<b>cursos más vistos en GFG, todo es gratis</b>
<a class=”prog” href=”https://www.geeksforgeeks.org/java-programming-examples/” id=”link1″>Java</a>
[<a class=”prog” href=”https://www.geeksforgeeks.org/java-programming-examples/” id=”link1″>Java</a>,
<a class=”prog” href=”https://www.geeksforgeeks.org/cc-programs/” id=”link2″>c/c++</a>,
<a class=”prog” href=”https://www.geeksforgeeks.org/python-programming-examples/” id=”link3″>Python</a>,
<a class=”prog” href=”https://https://www.geeksforgeeks.org/introduction-to-javascript/” id=”link4″>Javascript</a>,
<a class=”prog” href=”https://www.geeksforgeeks.org/ruby-programming-language/” id=”link5″>Ruby</a>]
Ejemplo 4: Contenidos y .child
Podemos obtener etiquetas secundarias en una lista usando .contents.
Sintaxis: (Variable BeautifulSoup).contents
Código:
Python3
soup = BeautifulSoup(ht_doc, 'html.parser') # assigning head tag of BeautifulSoup variable hTag = soup.head print(hTag) # retrieving contents of BeautifulSoup variable print(hTag.contents)
Producción:
<head><title>Geeks For Geeks</title></head> [<title>Geeks For Geeks</title>]
Ejemplo 5: .descendientes
El atributo .descendants le permite iterar sobre todos los elementos secundarios de una etiqueta, recursivamente: sus elementos secundarios directos y los elementos secundarios de sus elementos secundarios directos, etc.
Sintaxis: (Variable asignada desde BeautifulSoup Variable). descendientes
Código:
Python3
# embedding html document inyto BeautifulSoup variable soup = BeautifulSoup(ht_doc, 'html.parser') # assigning head element of BeautifulSoup-assigned Variable htag=soup.head # iterating through child in descendants of htag variable for child in htag.descendants: print(child)
Producción :
<title>Geeks For Geeks</title> Geeks For Geeks
Ejemplo 6: .string
Si la etiqueta tiene solo un elemento secundario y ese elemento secundario es NavigableString, el elemento secundario está disponible como .string
Sin embargo, si una etiqueta contiene más de una cosa, entonces no está claro a qué debe referirse .string, por lo que .string se define como Ninguno, podemos ver este funcionamiento práctico en el siguiente código.
Python3
soup = BeautifulSoup(ht_doc, 'html.parser') htag = soup.head print(htag.string)
Producción:
Geeks For Geeks
Ejemplo 7: .strings y stripped_strings
Si hay más de una cosa dentro de una etiqueta, aún puede mirar solo las strings. Usa el generador de .strings.
Python3
soup = BeautifulSoup(ht_doc, 'html.parser') for string in soup.strings : print(repr(string))
Producción :
'\n' 'Geeks For Geeks' '\n' '\n' 'most viewed courses in GFG,its all free' '\n' 'Top 5 Popular Programming Languages' '\n' 'Java' '\n' 'c/c++' '\n' 'Python' '\n' 'Javascript' '\n' 'Ruby' '\naccording to an online survey. ' '\n' ' Programming Languages' '\n'
Para la eliminación de espacios en blanco adicionales, usamos el generador .stripped_strings:
Python3
# embedding HTML document in BeautifulSoup-assigned variable soup = BeautifulSoup(ht_doc, 'html.parser') # iterating through string in stripped_strings of # BeautifulSoup assigned variable for string in soup.stripped_strings : print(repr(string))
Producción:
'Geeks For Geeks' 'most viewed courses in GFG,its all free' 'Top 5 Popular Programming Languages' 'Java' 'c/c++' 'Python' 'Javascript' 'Ruby' 'according to an online survey.' 'Programming Languages'
Navegando hacia arriba a través de BeautifulSoup:
Si consideramos una analogía de «árbol genealógico», cada etiqueta y cada string tiene un padre: la etiqueta que lo contiene:
Ejemplo 1: .parent.
La etiqueta .parent se utiliza para recuperar el elemento principal del elemento.
Sintaxis: (Variable BeautifulSoup).parent
Código:
Python3
ht_doc = """ <html><head><title>Geeks For Geeks</title></head> <body> <p class="title"><b>most viewed courses in GFG,its all free</b></p> <p class ="prog">Top 5 Popular Programming Languages</p> <a href="https://www.geeksforgeeks.org/java-programming-examples/"\ class="prog" id="link1">Java</a> <a href="https://www.geeksforgeeks.org/cc-programs/" class="prog" \ id="link2">c/c++</a> <a href="https://www.geeksforgeeks.org/python-programming-examples/"\ class="prog" id="link3">Python</a> <a href="https://https://www.geeksforgeeks.org/introduction-to-javascript/"\ class="prog" id="link4">Javascript</a> <a href="https://www.geeksforgeeks.org/ruby-programming-language/"\ class="prog" id="link5">Ruby</a> according to an online survey. </a> <p class="prog"> Programming Languages</p> </body></html> """ from bs4 import BeautifulSoup soup = BeautifulSoup(ht_doc, 'html.parser') # embedding html document Itag = soup.title # assigning title tag of BeautifulSoup-assigned variable # to print parent element in Itag variable print(Itag.parent) htmlTag = soup.html print(type(htmlTag.parent)) print(soup.parent)
Producción:
<head><title>Geeks For Geeks</title></head> <class 'bs4.BeautifulSoup'> None
Ejemplo 2: .padres
Para iterar en todos los elementos principales, se puede usar la etiqueta .parents:
Sintaxis: (Variable BeautifulSoup).parents
Python3
# embedding html doc into BeautifulSoup soup = BeautifulSoup(ht_doc, 'html.parser') # embedding a tag into link variable link = soup.a print(link) # iterating through parent in link variable for parent in link.parents : # printing statement for Parent is empty case if parent is None : print(parent) else : print(parent.name)
Producción:
<a class=”prog” href=”https://www.geeksforgeeks.org/java-programming-examples/” id=”link1″>Java</a>
cuerpo
html
[documento]
Navegando de lado con BeautifulSoup
.next_sibling y .previous_sibling son las etiquetas que se usan para navegar entre elementos de página que están en el mismo nivel del árbol de análisis.
Sintaxis:
(Variable BeautifulSoup).(atributo de etiqueta).next_sibling
(Variable BeautifulSoup).(atributo de etiqueta).anterior_hermano
Código:
Python3
from bs4 import BeautifulSoup sibling_soup = BeautifulSoup("<a><b>Geeks For Geeks</b><c><strong>The \ Biggest Online Tutorials Library, It's all Free</strong></b></a>") # to retrieve next sibling of b tag print(sibling_soup.b.next_sibling) # for retrieving previous sibling of c tag print(sibling_soup.c.previous_sibling)
Producción:
<c><strong>The Biggest Online Tutorials Library, It's all Free</strong></c> <b>Geeks For Geeks</b>
Publicación traducida automáticamente
Artículo escrito por ravi.geek24 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA