Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

AttributeError: 'NoneType' object has no attribute 'getText'

Boa tarde, Gostaria de um auxilio se possível, ao testar a mesma metodologia aprendida no curso de scraping em um outro site, funcionou corretamente para as primeiras 30 paginas das 50, a partir de uma página apresenta o erro. A questão é possível dar um pass, caso não encontre a informação desejada em algum dos cards ? Obrigado

for card in cards:
    produto = {}
    # Adicionando resultado à lista cards
    produto['Data'] = datetime.today().strftime('%Y-%m-%d')
    produto['Empresa'] = 'Continente'
    produto['Cod_Produto'] = card.find('div',{'class':'product'}).get('data-pid')
    produto['Marca'] = card.find('p',{'class':'ct-tile--brand'}).getText()
    produto['Design'] = card.find('a',{'class':'ct-tile--description'}).getText()
    produto['Tipo_Embalagem'] = card.find('p',{'class':'ct-tile--quantity'}).getText()
    ##produto['PVP Recomendado'] = card.find('p',{'class':'ct-discount-amount ct-discount-amount-pvpr'}).getText().replace('PVP Recomendado: ','')
    produto['Preco_1'] = card.find('span',{'class':'ct-price-formatted'}).getText().replace('\n','').replace('/','')
    produto['Preco_Formato'] = card.find('span',{'class':'ct-m-unit'}).getText().replace('\n','').replace('/','')
    produto['Preco_lt_kg'] = card.find('span',{'class':'ct-price-value'}).getText().replace('\n','').replace('/','')
    infos = card.find('div',{'class':'ct-tile--price-secondary'}).findAll('span')
    for info in infos:
        produto['Preco_Formato2'] = info.get_text()[2:4].split(',')[-1]
    ##produto['Desconto'] = card.find('span',{'class':'ct-product-tile-badge-value--pvpr'}).getText().replace('\n','').replace('/','')
    produto['Link'] = card.find('a',{'class':'ct-tile--description'}).get('href')
    produto['link_img'] = card.find('img',{'class':'ct-tile-image'}).get('data-src')
    # Adicionando resultado a lista cards
    produtos.append(produto)
    # Imagens
    image = card.find('img',{'class':'ct-tile-image'}).get('data-src')
    urlretrieve(image, './output/img_sonae/' + image.split('/')[-1].split('.')[0].split('-')[0]+'.jpeg')
# Criando um DataFrame com os resultados
#dataset = pd.DataFrame.from_dict(produto, orient = 'index').T
dataset = pd.DataFrame(produtos)
dataset.to_csv('./output/data/'+datetime.today().strftime('%Y-%m-%d')+'-continente.csv', sep=';', index = False, encoding = 'utf-8-sig')
dataset

`

AttributeError Traceback (most recent call last) in 28 produto['Preco_1'] = card.find('span',{'class':'ct-price-formatted'}).getText().replace('\n','').replace('/','') 29 produto['Preco_Formato'] = card.find('span',{'class':'ct-m-unit'}).getText().replace('\n','').replace('/','') ---> 30 produto['Preco_lt_kg'] = card.find('span',{'class':'ct-price-value'}).getText().replace('\n','').replace('/','') 31 infos = card.find('div',{'class':'ct-tile--price-secondary'}).findAll('span') 32 for info in infos:

AttributeError: 'NoneType' object has no attribute 'getText'

2 respostas
solução!

Oi John,

Você pode tentar colocar um try/except para tratar qualquer problema que possa ocorrer na leitura das informações de seu html. A estrutura seria como a seguinte:

for card in cards:
    try:
        <COLOQUE SEU CÓDIGO AQUI>
    except:
        continue

Espero ter ajudado

Olá Rodrigo, Funcionou, muito obrigado

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software