Navegación con BeautifulSoup

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *