1
resposta

não funciona find nem find_all

Faço essa raspagem e não funciona eu estou identando a ficha essa classe body-card ok mas quando depois vou chamar uma classe dentro retorna erro

ficha = carro.find('div', class_='body-card').find_all
print (ficha)

<bound method Tag.find_all of <div class="col-md-6 body-card">
<p class="txt-name inline">LAMBORGHINI AVENTADOR</p>
<p class="txt-category badge badge-secondary inline">USADO</p>
<p class="txt-motor">Motor 1.8 16v</p>
<p class="txt-description">Ano 1993 - 55.286 km</p>
<ul class="lst-items">
<li class="txt-items">► 4 X 4</li>
<li class="txt-items">► Câmera de estacionamento</li>
<li class="txt-items">► Controle de tração</li>
<li class="txt-items">► Sensor de estacionamento</li>
<li class="txt-items">...</li>
</ul>
<p class="txt-location">Belo Horizonte - MG<


ficha.find('p', class_='txt-name')


AttributeError                            Traceback (most recent call last)
<ipython-input-105-cea0ebdabb28> in <module>()
      1 ficha = carro.find('div', class_='body-card').find_all
----> 2 ficha.find('p', class_='txt-name')

AttributeError: 'function' object has no attribute 'find'
1 resposta

Oii Naoki, como você está?

Sinto muito pela demora em obter um retorno.

Para retornar uma lista de todas as ocorrências, precisamos utilizar o find_all. Da forma como você fez, você encontra apenas uma única ocorrência por estar utilizando find. Veja como fica a correção:

ficha = soup.find_all('div', class_='body-card')
ficha

Após obtermos a lista de elementos, precisamos percorrer elemento a elemento e procuramos o que nos interessa, ou seja, a tag p que possui a classe txt-name.

for item in ficha:
    print(item.find('p', class_="txt-name"))

Resultado:

<p class="txt-name inline">LAMBORGHINI AVENTADOR</p>
<p class="txt-name inline">BMW M2</p>
<p class="txt-name inline">ALFA</p>
<p class="txt-name inline">PUECH</p>
<p class="txt-name inline">LAMBORGHINI MURCIELAGO</p>
<p class="txt-name inline">ASTON MARTIN</p>
<p class="txt-name inline">TVR</p>
<p class="txt-name inline">EXCALIBUR</p>
<p class="txt-name inline">MCLAREN</p>
<p class="txt-name inline">TOYOTA</p>

Caso seja necessário extrair apenas o texto, basta utilizar o método getText():

for item in ficha:
    print(item.find('p', class_="txt-name").getText())

Qualquer dúvida estou por aqui, tá bom?

Grande abraço!