1
resposta

Tentei fazer um scraping pegando os preços dos produtos de um supermercado e roda o programa mas o dataset vem vazio.

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd

# Declarando variável cards


url = 'https://www.supermercadosmundial.com.br/ofertas'

response = urlopen(url)
html = response.read()

soup = BeautifulSoup(html, 'html.parser')

# Declarando variável cards
cards = []

anuncios = soup.find('div', class_="container").findAll(
    'div', class_='product no-gutter-left col-xs-6 col-sm-4 col-md-3')


for anuncio in anuncios:
    card = {}
    # Valor
    card['value'] = anuncio.find('span', {'class': 'price-product'}).getText()

    # Informações
    infos = anuncio.find(
        'span', class_='product no-gutter-left col-xs-6 col-sm-4 col-md-3 ').findAll('span')
    for info in infos:
        card[info.get('class')] = info.get_text()
        # Adicionando resultado a lista cards
        cards.append(card)


# Criando um DataFrame com os resultados
dataset = pd.DataFrame(cards)
dataset.to_csv('./dataset.csv', sep=';', index=False, encoding='utf-8-sig')
dataset
1 resposta

Olá Helio, tudo bem? Espero que sim!

Quando você inicia a variável anuncios ela retornar uma lista vazia, ou seja, não encontra nenhum item com essas especificações.

anuncios = soup.find('div', class_="container").findAll('div', class_='product no-gutter-left col-xs-6 col-sm-4 col-md-3')
print(anuncios)

Output:

[]

Tente mudar o que deseja pesquisar. Além disso o find() retorna um único valor enquanto o findAll() retorna uma lista de itens, portanto você está procurando os itens com o findAll() somente dentro de um único item com class_ = "container", esse item será o primeiro que ele encontrar no código HTML, visto que o find retorna somente a primeira aparição do elemento.

Caso deseje retornar em todos os containers por exemplo, basta deixar o findAll() sem o uso do find(), e ele irá encontrar todos os elementos com aquelas especificações.

Bons estudos!