find() y find_all() en BeautifulSoup: Guía 2026

Aprenda a utilizar los métodos find() y find_all() de BeautifulSoup para extraer de forma eficiente datos web por clase, ID, texto y atributos en Python.
12 min de lectura
How To Use BeautifulSoup’s find and find_all blog image

find() y find_all() son métodos esenciales para el Scraping web con BeautifulSoup, ya que te ayudan a extraer datos de HTML. El método find() recupera el primer elemento que coincide con tus criterios, como find("div") para obtener el primer div de una página, y devuelve None si no se encuentra ninguna coincidencia. Por su parte, find_all() encuentra todos los elementos que coinciden y los devuelve en forma de lista, lo que lo hace perfecto para extraer múltiples elementos, como todas las etiquetas div. Antes de empezar tu aventura de Scraping web con BeautifulSoup, asegúrate de tener instalados tanto Requests como BeautifulSoup.

Instala las dependencias

pip install requests
pip install beautifulsoup4

find()

Familiaricémonos con find(). En los ejemplos siguientes, utilizaremos Quotes To Scrape y Fake Store API para buscar elementos en la página. Ambos sitios web se crearon para el scraping. No cambian mucho, por lo que son perfectos para aprender.

Buscar por clase

Para buscar un elemento utilizando su clase, utilizamos la palabra clave class_. Quizás te preguntes por qué class_ y no class. En Python, class es una palabra clave que se utiliza para crear tipos de datos personalizados. El guión bajo en class_ evita que esta palabra clave cause conflictos con nuestro código.

El siguiente ejemplo busca el primer div con la clase: quote.

import requests
from bs4 import BeautifulSoup

response = requests.get("https://quotes.toscrape.com")

soup = BeautifulSoup(response.text, "html.parser")

first_quote = soup.find("div", class_="quote")
print(first_quote.text)

Este es el resultado.

«El mundo tal y como lo hemos creado es un proceso de nuestro pensamiento. No puede cambiarse sin cambiar nuestro pensamiento».
Albert Einstein
(acerca de)


Etiquetas:

cambio
pensamientos profundos
pensamiento
mundo

Buscar por ID

Al realizar el scraping, también es habitual buscar elementos utilizando su id. En el ejemplo siguiente, utilizamos el argumento id para buscar el menú en la página. Aquí, encontramos el menú en la página utilizando su id.

import requests
from bs4 import BeautifulSoup

response = requests.get("https://fakestoreapi.com")

soup = BeautifulSoup(response.text, "html.parser")

ul = soup.find("ul", id="menu")

print(ul.text)

Este es el menú una vez que lo hemos extraído y lo hemos impreso en la terminal.

Inicio
Documentación
GitHub
Invítame a un café

Buscar por texto

También podemos buscar elementos utilizando su texto. Para ello, utilizamos el argumento string. El siguiente ejemplo busca el botón Iniciar sesión en la página.

import requests
from bs4 import BeautifulSoup

response = requests.get("https://quotes.toscrape.com")

soup = BeautifulSoup(response.text, "html.parser")

login_button = soup.find("a", string="Login")
print(login_button.text)

Como puede ver, se imprime «Iniciar sesión» en la consola.

Iniciar sesión

Buscar por atributo

También podemos utilizar diferentes atributos para realizar búsquedas más precisas. En esta ocasión, volvemos a buscar la primera cita de la página. Sin embargo, buscamos un span con el itemprop del texto. De nuevo, encontramos nuestra primera cita, pero sin todos los elementos adicionales, como el autor y las etiquetas.

import requests
from bs4 import BeautifulSoup

response = requests.get("https://quotes.toscrape.com")

soup = BeautifulSoup(response.text, "html.parser")

first_clean_quote = soup.find("span", attrs={"itemprop": "text"})

print(first_clean_quote.text)

Aquí está la versión limpia de nuestra primera cita.

«El mundo tal y como lo hemos creado es un proceso de nuestro pensamiento. No puede cambiarse sin cambiar nuestro pensamiento».

Buscar utilizando múltiples criterios

Como habrás notado anteriormente, el argumento attr toma un diccionario en lugar de un solo valor. Esto nos permite pasar múltiples criterios para un filtrado aún mejor. Aquí, encontramos al primer autor de la página utilizando los atributos class e itemprop.

import requests
from bs4 import BeautifulSoup

response = requests.get("https://quotes.toscrape.com")

soup = BeautifulSoup(response.text, "html.parser")

first_author = soup.find("small", attrs={"class": "author", "itemprop": "author"})
print(first_author.text)

Al ejecutar esto, debería obtener Albert Einstein como resultado.

Albert Einstein

find_all()

Ahora, repasemos estos mismos ejemplos utilizando find_all(). Una vez más, utilizaremos Quotes to Scrape y la API de Fake Store. Estos ejemplos son casi idénticos, pero con una diferencia importante. find() devuelve un solo elemento. find_all() devuelve una lista de elementos de la página.

Buscar por clase

Para buscar elementos por su clase, utilizamos el argumento de palabra clave class_. El código siguiente utiliza find_all() para extraer cada cita utilizando su clase CSS.

import requests
from bs4 import BeautifulSoup

response = requests.get("https://quotes.toscrape.com")

soup = BeautifulSoup(response.text, "html.parser")

quotes = soup.find_all("div", class_="quote")

for quote in quotes:
    print("-------------")
    print(quote.text)

Cuando extraemos e imprimimos la primera página de citas, queda así.

-------------

«El mundo tal y como lo hemos creado es un proceso de nuestro pensamiento. No se puede cambiar sin cambiar nuestra forma de pensar».
por Albert Einstein
(sobre)


            Etiquetas:
            
cambio
pensamientos profundos
pensamiento
mundo


-------------

«Son nuestras elecciones, Harry, las que muestran lo que realmente somos, mucho más que nuestras habilidades».
por J.K. Rowling
(sobre)


            Etiquetas:
            
habilidades
elecciones


-------------

«Solo hay dos formas de vivir la vida. Una es como si nada fuera un milagro. La otra es como si todo fuera un milagro».
Por Albert Einstein.
(Acerca de)


Etiquetas:

inspirador
vida
vivir
milagro
milagros


-------------

«La persona, ya sea caballero o dama, que no disfruta de una buena novela, debe ser intolerablemente estúpida».
Por Jane Austen.
(Acerca de)


            Etiquetas:

analfabetismo
libros
clásico
humor


-------------

«La imperfección es belleza, la locura es genio y es mejor ser absolutamente ridículo que absolutamente aburrido».
Por Marilyn Monroe.
(sobre)


            Etiquetas:

sé tú mismo
inspirador


-------------

«Intenta no convertirte en un hombre de éxito. Más bien, conviértete en un hombre de valor».
Por Albert Einstein.
(sobre)


Etiquetas:

edad adulta
éxito
valor


-------------

«Es mejor ser odiado por lo que eres que ser amado por lo que no eres».
Por André Gide.
(sobre)


            Etiquetas:
            
vida
amor


-------------

«No he fracasado. Solo he encontrado 10 000 formas que no funcionan».
Por Thomas A. Edison.
(sobre)


            Etiquetas:

edison
fracaso
inspirador
parafraseado


-------------

«Una mujer es como una bolsita de té: nunca sabes lo fuerte que es hasta que la sumerges en agua caliente».
por Eleanor Roosevelt
(sobre)


            Etiquetas:

atribuido erróneamente a Eleanor Roosevelt


-------------

«Un día sin sol es como, ya sabes, la noche».
por Steve Martin
(sobre)


Etiquetas:

humor
obvio
símil

Buscar por ID

Como ya comentamos al hablar de find(), id es otro de los métodos más comunes que puedes utilizar para extraer datos de la página. Para extraer datos utilizando su id, utilizamos el argumento id… tal y como hicimos anteriormente.

A continuación, buscamos todos los elementos ul con un id de menú. Solo hay un menú, por lo que solo encontraremos uno.

import requests
from bs4 import BeautifulSoup

response = requests.get("https://fakestoreapi.com")

soup = BeautifulSoup(response.text, "html.parser")

uls = soup.find_all("ul", id="menu")

for ul in uls:
    print("-------------")
    print(ul.text)

Como solo hay un menú en la página, nuestro resultado es exactamente el mismo que cuando usamos find().

-------------

Inicio
Documentación
GitHub
Invítame a un café

Buscar por texto

Ahora extraeremos elementos de una página utilizando su texto. Utilizaremos el argumento string. En el ejemplo siguiente, encontramos todos los elementos a que contienen la cadena: Login. Una vez más, solo hay uno.

import requests
from bs4 import BeautifulSoup

response = requests.get("https://quotes.toscrape.com")

soup = BeautifulSoup(response.text, "html.parser")

login_buttons = soup.find_all("a", string="Login")

for button in login_buttons:
    print("-------------")
    print(button)

El resultado debería ser similar a este.

-------------
<a href="/login">Iniciar sesión</a>

Buscar por atributo

Cuando pases a realizar scraping en entornos reales, a menudo necesitarás utilizar otros atributos para extraer elementos de la página. ¿Recuerdas lo desordenado que era el resultado del primer ejemplo? En el siguiente fragmento de código, utilizaremos el atributo itemprop y esta vez solo extraeremos las citas.

import requests
from bs4 import BeautifulSoup

response = requests.get("https://quotes.toscrape.com")

soup = BeautifulSoup(response.text, "html.parser")

clean_quotes = soup.find_all("span", attrs={"itemprop": "text"})

for quote in clean_quotes:
    print("-------------")
    print(quote.text)

¡Mira qué limpio es nuestro resultado!

-------------
«El mundo tal y como lo hemos creado es un proceso de nuestro pensamiento. No se puede cambiar sin cambiar nuestra forma de pensar».
-------------
«Son nuestras elecciones, Harry, las que muestran lo que realmente somos, mucho más que nuestras habilidades».
-------------
«Solo hay dos formas de vivir la vida. Una es como si nada fuera un milagro. La otra es como si todo fuera un milagro».
-------------
«La persona, ya sea caballero o dama, que no disfruta de una buena novela, debe ser intolerablemente estúpida».
-------------
«La imperfección es belleza, la locura es genio y es mejor ser absolutamente ridículo que absolutamente aburrido».
-------------
«Intenta no convertirte en un hombre de éxito. Más bien, conviértete en un hombre de valor».
-------------
«Es mejor ser odiado por lo que eres que ser amado por lo que no eres».
-------------
«No he fracasado. Solo he encontrado 10 000 formas que no funcionan».
-------------
«Una mujer es como una bolsita de té: nunca sabes lo fuerte que es hasta que la sumerges en agua caliente».
-------------
«Un día sin sol es como, ya sabes, la noche».

Búsqueda mediante múltiples criterios

Esta vez, utilizaremos el argumento attrs de una forma más compleja. Aquí, buscamos todos los elementos pequeños que tienen una clase de autor y un itemprop de autor. Lo hacemos pasando ambos atributos a nuestro diccionario attrs.

import requests
from bs4 import BeautifulSoup

response = requests.get("https://quotes.toscrape.com")

soup = BeautifulSoup(response.text, "html.parser")

authors = soup.find_all("small", attrs={"class": "author", "itemprop": "author"})

for author in authors:
    print("-------------")
    print(author.text)

Aquí está nuestra lista de autores en la consola.

-------------
Albert Einstein
-------------
J.K. Rowling
-------------
Albert Einstein
-------------
Jane Austen
-------------
Marilyn Monroe
-------------
Albert Einstein
-------------
André Gide
-------------
Thomas A. Edison
-------------
Eleanor Roosevelt
-------------
Steve Martin

Técnicas avanzadas

Aquí hay algunas técnicas más avanzadas. En los ejemplos siguientes, utilizamos find_all(), pero estos métodos son igualmente compatibles cuando se utiliza find(). Solo recuerda: ¿quieres un único elemento o una lista de ellos?

Regex

Regex es una herramienta muy potente para la coincidencia de cadenas. En este ejemplo de código, lo combinamos con la cadena article para encontrar todos los elementos que contienen einstein, independientemente de si están en mayúsculas o minúsculas.

import requests
import re
from bs4 import BeautifulSoup

response = requests.get("https://quotes.toscrape.com")

soup = BeautifulSoup(response.text, "html.parser")

pattern = re.compile(r"einstein", re.IGNORECASE)

tags = soup.find_all(string=pattern)

print(f"Total de citas de Einstein: {len(tags)}")

Se han encontrado 3 citas en la página.

Total de citas de Einstein: 3

Funciones personalizadas

Ahora, escribamos una función personalizada para devolver todas las citas reales de Einstein. En el ejemplo siguiente, ampliamos la expresión regular. Utilizamos el método parent para recorrer y encontrar la tarjeta que contiene la cita. A continuación, encontramos todos los spans. El primer span de la tarjeta contiene la cita real. Imprimimos su contenido en la consola.

import requests
import re
from bs4 import BeautifulSoup

def find_einstein_quotes(http_response):
    soup = BeautifulSoup(http_response.text, "html.parser")

    #encontrar todas las etiquetas einstein
    pattern = re.compile(r"einstein", re.IGNORECASE)
    tags = soup.find_all(string=pattern)

    for tag in tags:
        #seguir a los padres hasta que tengamos la tarjeta de la cita
        full_card = tag.parent.parent.parent

        #encontrar los spans
        spans = full_card.find_all("span")

        #imprimir el primer span, que contiene la cita real
        print(spans[0].text)


if __name__ == "__main__":
    response = requests.get("https://quotes.toscrape.com")
    find_einstein_quotes(response)

Este es nuestro resultado.

«El mundo tal y como lo hemos creado es un proceso de nuestro pensamiento. No se puede cambiar sin cambiar nuestra forma de pensar».
«Solo hay dos formas de vivir la vida. Una es como si nada fuera un milagro. La otra es como si todo fuera un milagro».
«Intenta no convertirte en un hombre de éxito. Más bien, conviértete en un hombre de valor».

Bonus: Buscar utilizando selectores CSS

El método select de BeautifulSoup funciona casi exactamente igual que find_all(), pero es un poco más flexible. Este método utiliza un selector CSS. Si puedes escribir un selector, puedes encontrarlo. En este código, volvemos a encontrar a todos nuestros autores utilizando varios atributos. Sin embargo, podemos pasarlos como un único selector.

import requests
from bs4 import BeautifulSoup

response = requests.get("https://quotes.toscrape.com")

soup = BeautifulSoup(response.text, "html.parser")

authors = soup.select("small[class='author'][itemprop='author']")

for author in authors:
    print("-------------")
    print(author.text)

Este es el resultado.

-------------
Albert Einstein
-------------
J.K. Rowling
-------------
Albert Einstein
-------------
Jane Austen
-------------
Marilyn Monroe
-------------
Albert Einstein
-------------
André Gide
-------------
Thomas A. Edison
-------------
Eleanor Roosevelt
-------------
Steve Martin

Conclusión

Ahora ya conoce prácticamente todos los aspectos defind()yfind_all()en BeautifulSoup. No es necesario que domine todos estos métodos. La gran variedad de métodos de búsqueda le permite elegir el que más le convenga. Lo más importante es que puedes utilizarlos para extraer datos de cualquier página web. En producción, especialmente para obtener resultados rápidos y fiables con una alta tasa de éxito, es posible que desees considerar nuestrosProxies residencialeso inclusonuestro Navegador de scraping, que tiene un sistema de gestión de proxies integrado y capacidades de Resolución de CAPTCHA.

Regístrese y comience hoy mismo su prueba gratuita para encontrar el producto perfecto para sus necesidades.