ValueError: не удалось преобразовать строку в число с плавающей точкой: '' в python 3 ... Иногда? - PullRequest
1 голос
/ 19 февраля 2020

Итак, я кодирую маленького бота в python, и у меня возникла проблема. Кажется, это распространенная проблема, но я никогда не видел, чтобы ее спрашивали в той же ситуации, в которой я нахожусь.

Хорошо, так вот проблема постановки кода:

old_values = float((removeprc(browser.find_element_by_xpath('//*[@id="draggableNavRightResizable"]/section/section[2]/section[1]/div[3]/ul/li[1]/div[2]/div[6]/span').text)))

browser .find_element_by_xpath ( '// * [@ ID = "draggableNavRightResizable"] / раздел / раздел [2] / раздела [1] / дел [3] / мкл / Li [1] / дел [2] / дел [6] / span '). text) - это селеновый инструмент, используемый для получения стоимости сайта. как вы увидите позже, найденный элемент - это число, которое должно работать с float (). "remove pr c" - небольшая функция, которую я создал для удаления% числа, вот она:

def removeprc(string): #removes the % from a string 
    string = str(string)
    list = string.split('%')
    string = " ".join(list)

    return string

Вероятно, это не лучший способ сделать это, но он работает, когда я тестирую его в одиночку.

В любом случае, вот что я получаю, когда запускаю весь свой код

loading page ...
page loaded
acquiring values ...
values acquired
running eth trade
-0.37
Traceback (most recent call last):
  File "C:\Users\pc adam\Documents\EISTI\algoprog\perso\python\fichiers\btc\ETHtradingbotV1.py", line 138, in <module>
    profit = float(browser.find_element_by_xpath('/html/body/div[3]/section[16]/section[2]/section[2]/section[2]/div/div[1]/table/tbody/tr/td[15]/span').text)
ValueError: could not convert string to float: ''

первые 5 строк бесполезны. на 6-й строке я напечатал то, что я пытаюсь получить с плавающей точкой (). Как видите, это должно работать и ... Это работает! иногда.

это самая странная вещь в этом, она прекрасно работает в половине случаев! Я прочитал в inte rnet, что это может произойти, если вы попытаетесь использовать float () для вещей, которые не являются числами или имеют странное дерьмо, например пробелы. Как вы можете видеть, я думаю, что это не тот случай.

Когда я пытаюсь изолировать проблему, запустив упрощенную версию программы, например:

a = "-0.06%"
def removeprc(string): #removes the % from a string 
    string = str(string)
    list = string.split('%')
    string = " ".join(list)
    return string

b = float(removeprc(a))
print(b)

, она выдает -0.06 и работает отлично ???

Так что я действительно застрял здесь. Это должно работать, но это не так. Даже хуже, он работает иногда , без причины. И когда я изолирую проблему, она работает нормально.

Любая помощь будет чрезвычайно признательна!

О, и если вы хотите увидеть весь код, он здесь: https://github.com/Madaxuorel/proj-ethTB/blob/master/ETHtradingbotV1.py

Ответы [ 3 ]

0 голосов
/ 19 февраля 2020

Это сообщение об ошибке ...

ValueError: could not convert string to float: ''

... означает, что интерпретатору Python не удалось преобразовать строку в число с плавающей точкой.


Вы были достаточно близко. text метод вернет строку и удалит % вместо string.split('%'), который вы хотите list = string.split('%')[0].

Пример:

my_percentage = "99%"
my_string_num = my_percentage.split("%")[0]
print(my_string_num)

печатает:

99

Далее, find_element_by_xpath() будет идентифицировать только один элемент и с использованием text вы получите одну строку , поэтому string = " ".join(list) кажется избыточным.

Таким образом, чтобы эффективно вырезать %, преобразуйте строку в с плавающей точкой и напечатайте, ваша эффективная строка кода будет:

print(float(browser.find_element_by_xpath('//*[@id="draggableNavRightResizable"]/section/section[2]/section[1]/div[3]/ul/li[1]/div[2]/div[6]/span').text.split("%")[0]))

Обновление

Вы по-прежнему видите ошибку, так как элемент с требуемым текстом не отрисован в пределах DOM , когда вызывается строка кода. В качестве решения вам нужно вызвать WebDriverWait для visibility_of_element_located(), и вы можете использовать следующую Стратегию локатора :

print(float(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//*[@id='draggableNavRightResizable']/section/section[2]/section[1]/div[3]/ul/li[1]/div[2]/div[6]/span"))).text.split("%")[0]))

Примечание : Вы должны добавить следующий импорт:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
0 голосов
/ 19 февраля 2020

Возвращаемый текст является пустой строкой, поэтому его нельзя преобразовать в float. Добавить чек

b = removeprc(a)
if b:
    print(float(b))
else:
    print('b is an empty string')
0 голосов
/ 19 февраля 2020

Вы использовали ключевое слово в качестве переменной здесь. Вот почему иногда это не работает, я думаю. Как и str (), list () - это метод для преобразования переменной в список. Попробуйте переименовать переменную, как показано ниже.

def removeprc(string): #removes the % from a string 
    string = str(string)
    l = string.split('%')
    string = " ".join(l)
    return string
...