find() e find_all() são métodos essenciais para Scraping de dados com BeautifulSoup, ajudando você a extrair dados de HTML. O método find() recupera o primeiro elemento que corresponde aos seus critérios, como find("div") para obter o primeiro div em uma página, retornando None se nenhuma correspondência for encontrada. Enquanto isso, find_all() encontra todos os elementos correspondentes e os retorna como uma lista, tornando-o perfeito para extrair vários elementos, como todas as tags div. Antes de iniciar sua jornada de Scraping de dados com o BeautifulSoup, certifique-se de ter o Requests e o BeautifulSoup instalados.
Instale as dependências
pip install requests
pip install beautifulsoup4
find()
Vamos nos familiarizar com find(). Nos exemplos abaixo, usaremos Quotes To Scrape e Fake Store API para encontrar elementos na página. Ambos os sites foram criados para scraping. Eles não mudam muito, então são perfeitos para aprender.
Localizar por classe
Para encontrar um elemento usando sua classe, usamos a palavra-chave class_. Você pode se perguntar por que class_ e não class? Em Python, class é uma palavra-chave usada para criar tipos de dados personalizados. O sublinhado em class_ evita que essa palavra-chave cause conflitos com nosso código.
O exemplo abaixo encontra o primeiro div com a classe: 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)
Aqui está o nosso resultado.
“O mundo como o criamos é um processo do nosso pensamento. Ele não pode ser mudado sem mudar nosso pensamento.”
por Albert Einstein
(sobre)
Tags:
mudança
pensamentos profundos
pensamento
mundo
Encontrar por ID
Ao fazer scraping, você também precisará procurar elementos usando sua identificação. No exemplo abaixo, usamos o argumento id para encontrar o menu na página. Aqui, encontramos o menu na página usando sua identificação.
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)
Aqui está o menu depois de extraído e impresso no terminal.
Página inicial
Documentação
GitHub
Compre-me um café
Pesquisar por texto
Também podemos pesquisar itens usando seu texto. Para fazer isso, usamos o argumento string. O exemplo abaixo encontra o botão Login na 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 você pode ver, Login é impresso no console.
Login
Encontrar por atributo
Também podemos usar diferentes atributos para uma pesquisa mais precisa. Desta vez, encontramos novamente a primeira citação da página. No entanto, procuramos um span com o itemprop do texto. Isso encontra novamente nossa primeira citação, mas sem todas as informações extras, como autor e tags.
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"})
imprimir(primeira_citação_limpa.texto)
Aqui está a versão limpa da nossa primeira citação.
“O mundo como o criamos é um processo do nosso pensamento. Ele não pode ser mudado sem mudar nosso pensamento.”
Encontrar usando vários critérios
Como você deve ter notado anteriormente, o argumento attr aceita um dicionário em vez de um único valor. Isso nos permite passar vários critérios para uma filtragem ainda melhor. Aqui, encontramos o primeiro autor na página usando os 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"})
imprimir(primeiro_autor.texto)
Ao executar isso, você deve obter Albert Einstein como resultado.
Albert Einstein
find_all()
Agora, vamos examinar esses mesmos exemplos usando find_all(). Mais uma vez, usaremos Quotes to Scrape e a API Fake Store. Esses exemplos são quase idênticos, mas com uma diferença importante. find() retorna um único elemento. find_all() retorna uma lista de elementos da página.
Localizar por classe
Para encontrar elementos usando sua classe, usamos o argumento de palavra-chave class_. O código abaixo usa find_all() para extrair cada citação usando sua classe 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)
Quando extraímos e imprimimos a primeira página de citações, ela fica assim.
-------------
“O mundo como o criamos é um processo do nosso pensamento. Ele não pode ser mudado sem mudar nosso pensamento.”
por Albert Einstein
(sobre)
Tags:
mudança
pensamentos profundos
pensamento
mundo
-------------
“São nossas escolhas, Harry, que mostram quem realmente somos, muito mais do que nossas habilidades.”
por J.K. Rowling
(sobre)
Tags:
habilidades
escolhas
-------------
“Existem apenas duas maneiras de viver sua vida. Uma é como se nada fosse um milagre. A outra é como se tudo fosse um milagre.”
por Albert Einstein
(sobre)
Tags:
inspirador
vida
viver
milagre
milagres
-------------
“A pessoa, seja homem ou mulher, que não tem prazer em um bom romance, deve ser intoleravelmente estúpida.”
por Jane Austen
(sobre)
Tags:
analfabetismo
livros
clássico
humor
-------------
“A imperfeição é beleza, a loucura é genialidade e é melhor ser absolutamente ridículo do que absolutamente chato.”
por Marilyn Monroe
(sobre)
Tags:
seja-você-mesmo
inspirador
-------------
“Tente não se tornar um homem de sucesso. Em vez disso, torne-se um homem de valor.”
por Albert Einstein
(sobre)
Tags:
idade adulta
sucesso
valor
-------------
“É melhor ser odiado pelo que você é do que ser amado pelo que você não é.”
por André Gide
(sobre)
Tags:
vida
amor
-------------
“Eu não falhei. Apenas descobri 10.000 maneiras que não funcionam.”
por Thomas A. Edison
(sobre)
Tags:
edison
fracasso
inspirador
parafraseado
-------------
“Uma mulher é como um saquinho de chá; você nunca sabe o quão forte ele é até colocá-lo na água quente.”
por Eleanor Roosevelt
(sobre)
Tags:
atribuída erroneamente a Eleanor Roosevelt
-------------
“Um dia sem sol é como, você sabe, a noite.”
por Steve Martin
(sobre)
Tags:
humor
óbvio
comparação
Encontrar por ID
Como falamos ao usar find(), id é outro dos métodos mais comuns que você pode usar para extrair dados da página. Para extrair dados usando seu id, usamos o argumento id… assim como fizemos anteriormente.
Em seguida, encontramos todos os itens ul com um id de menu. Há apenas um menu, então, na verdade, encontraremos apenas um.
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("-------------")
imprimir(ul.text)
Como há apenas um menu na página, nossa saída é exatamente a mesma que quando usamos find().
-------------
Página inicial
Documentação
GitHub
Compre-me um café
Localizar por texto
Agora, vamos extrair itens de uma página usando seu texto. Usaremos o argumento string. No exemplo abaixo, encontramos todos os elementos a que contêm a string: Login. Mais uma vez, há apenas um.
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")
para botão em botões_de_login:
imprimir("-------------")
imprimir(botão)
Sua saída deve ficar assim.
-------------
<a href="/login">Login</a>
Encontrar por atributo
Quando você passar para a extração em ambientes reais, muitas vezes precisará usar outros atributos para extrair itens da página. Lembra-se de como a saída do primeiro exemplo ficou confusa? No próximo trecho, usaremos o atributo itemprop e, desta vez, extrairemos apenas as citações.
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)
Veja como nossa saída está limpa!
-------------
“O mundo que criamos é um processo do nosso pensamento. Ele não pode ser mudado sem mudar nosso pensamento.”
-------------
“São nossas escolhas, Harry, que mostram quem realmente somos, muito mais do que nossas habilidades.”
-------------
“Existem apenas duas maneiras de viver sua vida. Uma é como se nada fosse um milagre. A outra é como se tudo fosse um milagre.”
-------------
“A pessoa, seja ela um cavalheiro ou uma dama, que não tem prazer em um bom romance, deve ser intoleravelmente estúpida.”
-------------
“A imperfeição é beleza, a loucura é genialidade e é melhor ser absolutamente ridículo do que absolutamente chato.”
-------------
“Tente não se tornar um homem de sucesso. Em vez disso, torne-se um homem de valor.”
-------------
“É melhor ser odiado pelo que você é do que ser amado pelo que você não é.”
-------------
“Eu não falhei. Apenas descobri 10.000 maneiras que não funcionam.”
-------------
“Uma mulher é como um saquinho de chá; você nunca sabe o quão forte ele é até colocá-lo na água quente.”
-------------
“Um dia sem sol é como, você sabe, a noite.”
Encontrar usando vários critérios
Desta vez, usaremos o argumento attrs de uma forma mais complexa. Aqui, encontramos todos os pequenos elementos que têm uma classe de autor e um itemprop de autor. Fazemos isso passando ambos os atributos para o nosso dicionário 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)
Aqui está nossa lista de autores no console.
-------------
Albert Einstein
-------------
J.K. Rowling
-------------
Albert Einstein
-------------
Jane Austen
-------------
Marilyn Monroe
-------------
Albert Einstein
-------------
André Gide
-------------
Thomas A. Edison
-------------
Eleanor Roosevelt
-------------
Steve Martin
Técnicas avançadas
Aqui estão algumas técnicas mais avançadas. Nos exemplos abaixo, usamos find_all(), mas esses métodos são igualmente compatíveis quando usamos find(). Lembre-se: você quer um único elemento ou uma lista deles?
Regex
Regex é uma ferramenta muito poderosa para correspondência de strings. Neste exemplo de código, combinamos com a string article para encontrar todos os elementos que contêm einstein, independentemente de suas letras maiúsculas ou 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)
imprimir(f"Total de citações de Einstein: {len(tags)}")
Foram encontradas 3 citações na página.
Total de citações de Einstein: 3
Funções personalizadas
Agora, vamos escrever uma função personalizada para retornar todas as citações reais de Einstein. No exemplo abaixo, expandimos a expressão regular. Usamos o método pai para percorrer e encontrar o cartão que contém a citação. Em seguida, encontramos todos os spans. O primeiro span no cartão contém a citação real. Imprimimos seu conteúdo no console.
import requests
import re
from bs4 import BeautifulSoup
def find_einstein_quotes(http_response):
soup = BeautifulSoup(http_response.text, "html.parser")
#encontrar todas as tags einstein
pattern = re.compile(r"einstein", re.IGNORECASE)
tags = soup.find_all(string=padrão)
para tag em tags:
#siga os pais até encontrarmos o cartão da citação
cartão_completo = tag.parent.parent.parent
#encontre os spans
spans = cartão_completo.find_all("span")
#imprima o primeiro span, ele contém a citação real
imprimir(spans[0].text)
if __name__ == "__main__":
response = requests.get("https://quotes.toscrape.com")
find_einstein_quotes(response)
Aqui está o nosso resultado.
“O mundo que criamos é um processo do nosso pensamento. Ele não pode ser mudado sem mudar nosso pensamento.”
“Existem apenas duas maneiras de viver sua vida. Uma é como se nada fosse um milagre. A outra é como se tudo fosse um milagre.”
“Tente não se tornar um homem de sucesso. Em vez disso, torne-se um homem de valor.”
Bônus: Encontre usando seletores CSS
O método select do BeautifulSoup funciona quase exatamente como find_all(), mas é um pouco mais flexível. Esse método aceita um seletor CSS. Se você consegue escrever um seletor, você consegue encontrar. Neste código, encontramos todos os nossos autores usando vários atributos novamente. No entanto, podemos passá-los como um único seletor.
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']")
para autor em autores:
imprimir("-------------")
imprimir(autor.text)
Aqui está o nosso resultado.
-------------
Albert Einstein
-------------
J.K. Rowling
-------------
Albert Einstein
-------------
Jane Austen
-------------
Marilyn Monroe
-------------
Albert Einstein
-------------
André Gide
-------------
Thomas A. Edison
-------------
Eleanor Roosevelt
-------------
Steve Martin
Conclusão
Agora você conhece praticamente todos os aspectos dofind()edo find_all()no BeautifulSoup. Você não precisa dominar todos esses métodos. A grande variedade de métodos de localização permite que você escolha aquele com o qual se sente mais confortável. Mais importante ainda, você pode usá-los para extrair dados de qualquer página da web. Na produção, especialmente para resultados rápidos e confiáveis com uma alta taxa de sucesso, você pode considerar nossosProxies residenciaisou até mesmoo Navegador de scraping, que possui um sistema de gerenciamento de Proxy integrado e recursos de Resolução de CAPTCHA.
Inscreva-se e comece hoje mesmo seu teste grátis para encontrar o produto perfeito para suas necessidades.