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

Informação repetida n a saída na tela ao fazer o print do card

Boa Noite!

Estou fazendo pelo VSCode e ao printar o "card" as informações saem repetidas assim:

" {'value': 'R$ 338.000', 'name': 'LAMBORGHINI AVENTADOR'} {'value': 'R$ 338.000', 'name': 'LAMBORGHINI AVENTADOR', 'category': 'USADO'} {'value': 'R$ 338.000', 'name': 'LAMBORGHINI AVENTADOR', 'category': 'USADO', 'motor': 'Motor 1.8 16v'} {'value': 'R$ 338.000', 'name': 'LAMBORGHINI AVENTADOR', 'category': 'USADO', 'motor': 'Motor 1.8 16v', 'description': 'Ano 1993 - 55.286 km'} {'value': 'R$ 338.000', 'name': 'LAMBORGHINI AVENTADOR', 'category': 'USADO', 'motor': 'Motor 1.8 16v', 'description': 'Ano 1993 - 55.286 km', 'location': 'Belo Horizonte - MG'} [Finished in 1.7s]

"

from bs4 import BeautifulSoup
from urllib.request import urlopen

url = 'http://alura-site-scraping.herokuapp.com/'
response = urlopen(url)
html = response.read().decode('utf-8')
soup = BeautifulSoup(html,'html.parser')
soup
#print(soup.h1)

cards = []
card = {}

anuncio = soup.find('div',{'class':'well card'})
anuncio


anuncio.find('div',{'class':'value-card'})

anuncio.find('p',{'class':'txt-value'}).getText()
card['value'] = anuncio.find('p',{'class':'txt-value'}).getText() #Essa parte vai usar no final
#print(card)

infos = anuncio.find('div',{'class':'body-card'}).findAll('p')
'''
for info in infos:
    print(info.get('class')[0].split('-')[-1],'-',info.get_text())
'''
for info in infos:
    card[info.get('class')[0].split('-')[-1]] = info.get_text()
    print(card)

2 respostas
solução!

Olá Filipe,

Não está exatamente repetindo, está aparecendo assim porque o print está dentro do for onde está sendo montando o anúncio parte a parte. O card começa apenas com o value então primeiro é adicionado o name e já é mostrado, segundo é adicionado a category e então é mostrado novamente, e assim por diante:

Assim dá pra ver melhor que está sendo mostrado cada passo da montagem do card:

{'value': 'R$ 338.000', 'name': 'LAMBORGHINI AVENTADOR'}
{'value': 'R$ 338.000', 'name': 'LAMBORGHINI AVENTADOR', 'category': 'USADO'} 
{'value': 'R$ 338.000', 'name': 'LAMBORGHINI AVENTADOR', 'category': 'USADO', 'motor': 'Motor 1.8 16v'} 
{'value': 'R$ 338.000', 'name': 'LAMBORGHINI AVENTADOR', 'category': 'USADO', 'motor': 'Motor 1.8 16v', 'description': 'Ano 1993 - 55.286 km'} 
{'value': 'R$ 338.000', 'name': 'LAMBORGHINI AVENTADOR', 'category': 'USADO', 'motor': 'Motor 1.8 16v', 'description': 'Ano 1993 - 55.286 km', 'location': 'Belo Horizonte - MG'}

Então como o for está montando o card, se você colocar o print após o for vai ser mostrado o card apenas uma vez após ter sido completamente montado:

for info in infos:
    card[info.get('class')[0].split('-')[-1]] = info.get_text()

print(card)

Resultado:

{'value': 'R$ 338.000', 'name': 'LAMBORGHINI AVENTADOR', 'category': 'USADO', 'motor': 'Motor 1.8 16v', 'description': 'Ano 1993 - 55.286 km', 'location': 'Belo Horizonte - MG'}

Espero ter ajudado, qualquer dúvida é só falar!

Quando terminei o curso funcionou normalmente. Estava em dúvida nesta parte. Muito Obrigado!