1
votes

Python beautifulsoup imprimant l'élément souhaité

Une fois que j'ai trouvé l'élément souhaité, j'ai ceci:

from selenium import webdriver
from selenium.webdriver.remote import webelement
import pandas as pd
import time
from bs4 import BeautifulSoup

driver = webdriver.Chrome('chromedriver.exe')
driver.get('https://www.redfin.com/')
search_box = driver.find_element_by_name('searchInputBox')
search_box.send_keys('693 Bluebird Canyon Drive, Laguna Beach, CA 92651')
search_box.submit()
time.sleep(2)

def get_address_url(address):
    url_list = []
    search_box = driver.find_element_by_name('searchInputBox')
    search_box.send_keys('693 Bluebird Canyon Drive, Laguna Beach, CA 92651')
    search_box.submit()
    time.sleep(2)
    url_list.append(driver.current_url)

# element = driver.find_elements_by_class_name('statsValue')
# print(element[0].get_attribute('innerHTML'))

soup = BeautifulSoup(driver.page_source, 'html.parser')
data = soup.find_all(lambda tag: tag.name == 'div' and tag.get('class') == ['statsValue'])

print(data)
print(len(data))
print(type(data))

driver.quit()

Je voudrais simplement obtenir le nombre 1 615 422 $ . Comment puis-je faire cela? Je n'ai rien trouvé d'utile en ligne.

Voici mon code:

[<div class="statsValue">$1,615,422</div>, <div class="statsValue">1</div>, <div class="statsValue">2</div>]


0 commentaires

3 Réponses :


1
votes

Vous voulez l'attribut text .

data = soup.find_all(lambda tag: tag.name == 'div' and tag.get('class') == ['statsValue'])
for element in data:
    print (element.text)


3 commentaires

Savez-vous pourquoi sqft n'est pas capturé alors que c'est aussi une statsValue?


Y a-t-il une autre classe en plus de statsValue? Votre fonction lambda trouve les div avec une seule classe.


Non me semble être pareil.



1
votes

Vous pouvez utiliser regex et sub pour supprimer les chiffres non:

soup = BeautifulSoup(driver.page_source, 'html.parser')
stats = soup.select(".statsValue")
for s in stats:
    print(s.text)

Résultat:

1615422

import re

price = re.sub("[^0-9]", "", "$1,615,422")
print(price)


0 commentaires

2
votes

Si vous voulez seulement obtenir le nombre 1 615 422 $ , je pense que les requêtes sont suffisantes.

J'espère que ce code vous aidera

import requests
from bs4 import BeautifulSoup as Soup

url = 'https://www.redfin.com/CA/Laguna-Beach/693-Bluebird-Canyon-Dr-92651/home/4894466'

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'
}

r = requests.get(url, headers=headers)

soup = Soup(r.text, 'html5lib')
data = soup.find('div', {'class', 'avm'}).div.text

print(data) # $1,615,422


0 commentaires