Pobieranie tylko liczb z BeautifulSoup zamiast całych div

Nov 24 2020

Próbuję nauczyć się Pythona, tworząc mały program do tworzenia stron internetowych, aby ułatwić życie, chociaż mam problemy z pobieraniem liczby tylko podczas korzystania z BS4. Udało mi się uzyskać cenę, kiedy zeskrobałem rzeczywistą reklamę, ale chciałbym uzyskać wszystkie ceny ze strony.

Oto mój kod:

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)

Oto mój wynik

[<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>

Idealnie byłoby, gdyby wynik miał wartość „46 999,00”.

Próbowałem z tekstem = True, chociaż to nie zadziałało i nie uzyskałem z niego żadnego wyniku poza pustą listą.

Dziękuję Ci

Odpowiedzi

1 MendelG Nov 24 2020 at 22:54

Opcją bez użycia wyrażenia regularnego jest odfiltrowanie tagów startwith()oznaczających znak dolara $:

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)

Wynik:

['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

Musisz pobrać tekstową część tagu, a następnie przeprowadzić na niej przetwarzanie wyrażeń regularnych.

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

Po prostu wywołaj tę metodę w swoim kodzie po znalezieniu elementów div

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)