Obtendo apenas números de BeautifulSoup em vez de div inteiro

Nov 24 2020

Estou tentando aprender python criando um pequeno programa de webraping para tornar a vida mais fácil, embora esteja tendo problemas em obter apenas o número ao usar o BS4. Consegui obter o preço quando raspei um anúncio real, mas gostaria de obter todos os preços da página.

Aqui está o meu código:

from bs4 import BeautifulSoup
import requests
prices = []
url = 'https://www.kijiji.ca/b-cars-trucks/calgary/new__used/c174l1700199a49?ll=51.044733%2C-114.071883&address=Calgary%2C+AB&radius=50.0'
result = requests.get(url)
print (result.status_code)
src = result.content
soup = BeautifulSoup(src, 'html.parser')
print ("CLEARING")
price = soup.findAll("div", class_="price")
prices.append(price)
print (prices)

Aqui está minha saída

[<div class="price">
                        
                            
                            
                                
                                
                                    $46,999.00 <div class="dealer-logo"> <div class="dealer-logo-image"> <img src="https://i.ebayimg.com/00/s/NjBYMTIw/z/xMQAAOSwi9ZfoW7r/$_69.PNG"/>
</div>
</div>
</div>

Idealmente, eu gostaria que a saída fosse "46.999,00".

Tentei com text = True, embora isso não funcionasse e eu não recebesse nenhuma saída dele além de uma lista vazia.

Obrigado

Respostas

1 MendelG Nov 24 2020 at 22:54

Uma opção sem usar RegEx é filtrar as tags que têm startwith()um cifrão $:

import requests
from bs4 import BeautifulSoup

URL = 'https://www.kijiji.ca/b-cars-trucks/calgary/new__used/c174l1700199a49?ll=51.044733%2C-114.071883&address=Calgary%2C+AB&radius=50.0'

soup = BeautifulSoup(requests.get(URL).content, "html.parser")

price_tags = soup.find_all("div", class_="price")

prices = [
    tag.get_text(strip=True)[1:] for tag in price_tags
    if tag.get_text(strip=True).startswith('$')
]

print(prices)

Resultado:

['48,888.00', '21,999.00', '44,488.00', '5,500.00', '33,000.00', '14,900.00', '1,750.00', '35,600.00', '1,800.00', '25,888.00', '36,888.00', '32,888.00', '30,888.00', '18,888.00', '21,888.00', '29,888.00', '22,888.00', '30,888.00', '17,888.00', '17,888.00', '16,888.00', '22,888.00', '22,888.00', '34,888.00', '31,888.00', '32,888.00', '30,888.00', '21,888.00', '15,888.00', '21,888.00', '28,888.00', '19,888.00', '18,888.00', '30,995.00', '30,995.00', '30,995.00', '19,888.00', '47,995.00', '21,888.00', '46,995.00', '32,888.00', '29,888.00', '26,888.00', '21,888.00']
3 ATIFADIB Nov 24 2020 at 13:14

Você precisa obter a parte do texto da tag e, em seguida, executar algum processamento de regex nela.

import re

def get_price_from_div(div_item):
    str_price = re.sub('[^0-9\.]','', div_item.text)
    float_price = float(str_price)
    return float_price

Basta chamar esse método em seu código depois de encontrar os divs

from bs4 import BeautifulSoup
import requests
prices = []
url = 'https://www.kijiji.ca/b-cars-trucks/calgary/new__used/c174l1700199a49?ll=51.044733%2C-114.071883&address=Calgary%2C+AB&radius=50.0'
result = requests.get(url)
print (result.status_code)
src = result.content
soup = BeautifulSoup(src, 'html.parser')
print ("CLEARING")
price = soup.findAll("div", class_="price")
prices.extend([get_price_from_div(curr_div) for curr_div in price])
print (prices)