Как получить цену в виде числа с веб-сайта с помощью Selenium и Python

Я создаю бота, который автоматизирует мою работу и копирует определенные значения с определенного веб-сайта. Все работает нормально, но последние строки моего кода, в которых говорится, что w.text дает результат, который является текстом, и мне нужно число. Каждый элемент, значение которого мне нужно, после проверки выглядит так:

<span class="good">€25,217.65</span>

Как получить значение в виде числа, а не в виде текста? Я пробовал w.value или w.get_attribute('value), но это не работает. Вот моя программа (без учета загрузки библиотек и файлов)

driver = webdriver.Chrome(driver_path)   
driver.get('https://seabass-admin.igp.cloud/')   
# waiting for login table to load
try:
    element = WebDriverWait(driver,10).until(
    ec.presence_of_element_located((By.XPATH,'//*[@id="email"]'))
    )
except:
    driver.quit()

#entering sensitive info
driver.find_element_by_id("email").send_keys(pwx.em)                                  # login details
driver.find_element_by_id("password").send_keys(pwx.pw)                               # password 
details
driver.find_element_by_xpath('//*[@id="appContainer"]/div/form/button').click()       # click sign in

# waiting for page to load
try:
    element = WebDriverWait(driver,10).until(
    ec.presence_of_element_located((By.XPATH,'//* 
[@id="testing"]/section/section[4]/div/table/tbody/tr[2]/td[3]/span'))
    )
except:
    driver.quit()

# getting info from the page
w = driver.find_element_by_xpath('//* 
[@id="testing"]/section/section[4]/div/table/tbody/tr[2]/td[3]/span')
cell = outcome['import']
cell[withdrawal_cell].value = w.text

person Ellie Biessek    schedule 16.06.2020    source источник
comment
так что вы получаете это значение - w.text как €25,217.65 ?   -  person Sowjanya R Bhat    schedule 16.06.2020


Ответы (2)


Для этого вы можете использовать некоторые встроенные функции Python:

  1. str.strip(), чтобы удалить начальные или конечные ' символ €, то
  2. str.replace() для удаления ',' (замените это с пустой строкой '')

Конкретно:

str_w = w.text  # this is the '€25,217.65' string
digits=str_w.strip('€').replace(',','')     # use the functions above to get number-like string
cell[withdrawal_cell].value = float(digits)   # convert to float number
person 0buz    schedule 16.06.2020
comment
получение сообщения об ошибке Объект «WebElement» не имеет атрибута «полоса» - person Ellie Biessek; 16.06.2020
comment
Вам нужно применить это к объекту строкового типа, это w.text (эта строка str_w = w.text), а не w (веб-элемент). - person 0buz; 16.06.2020

Согласно HTML, которым вы поделились:

<span class="good">€25,217.65</span>

Текст 25 217,65 евро является innerHTML.

Таким образом, вы можете извлечь текст €25 217,65, используя один из следующих способов:

  • w.get_attribute("innerHTML")
  • атрибут текст.

Теперь, чтобы получить значение 25 217,65 евро в виде числа вместо текста, вам необходимо:

  • Удалите символы и ,, используя re.sub():

    import re
    
    string = "€25,217.65"
    my_string = re.sub('[€,]', '', string)
    
  • Наконец, чтобы преобразовать string в float, вам нужно передать строку в качестве аргумента float() следующим образом:

    my_number = float(my_string)
    

Итак, вся операция в одной строке:

import re

string = "€25,217.65"       
print(float(re.sub('[€,]', '', string)))

По сути, ваша строка кода может быть любой из следующих:

  • Используя атрибут text:

    cell[withdrawal_cell].value = float(re.sub('[€,]', '', w.text))
    
  • Использование get_attribute("innerHTML"):

    cell[withdrawal_cell].value = float(re.sub('[€,]', '', w.get_attribute("innerHTML")))
    
person DebanjanB    schedule 16.06.2020
comment
Я могу легко получить его в виде текста, но мне нужно, чтобы он был числом — в этом весь смысл. Потому что, когда он сохраняет все значения, которые я выдрал из сети, мне нужно затем выполнить математические операции, но в данный момент мне нужно зайти в файл, вручную изменить формат на число из текста - только тогда я могу продолжить. Я пытаюсь все автоматизировать, поэтому мне нужно это число как число, а не как текст. - person Ellie Biessek; 16.06.2020
comment
@EllieBiessek Ознакомьтесь с обновленным ответом и дайте мне знать о статусе. - person DebanjanB; 16.06.2020