1
votes

ValueError: impossible de convertir la chaîne en float: '' en python 3

Donc je code un petit bot en python et j'ai un problème. Cela semble être un problème courant, mais je ne l'ai jamais vu poser dans la même situation dans laquelle je suis.

D'accord, voici le code posant problème:

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)

browser.find_element_by_xpath ('// * [@ id = "draggableNavRightResizable"] / section / section [2] / section [1] / div [3] / ul / li [1] / div [2] / div [ 6] / span '). Text) est un outil au sélénium utilisé pour obtenir la valeur d'un site Web. comme vous le verrez plus tard, l'élément récupéré est un nombre qui devrait fonctionner avec float () "remove prc" est une petite fonction que j'ai créée pour supprimer le% d'un nombre, la voici:

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

Ce n'est probablement pas la meilleure façon de le faire, mais ça marche quand je le teste seul.

de toute façon, voici ce que j'obtiens quand j'exécute tout mon code

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

    return string

les 5 premières lignes sont inutiles. sur la 6ème ligne, j'ai imprimé ce que j'essaye d'obtenir le flotteur () de. Comme vous pouvez le voir, cela devrait fonctionner et ... C'est le cas! parfois.

c'est la chose la plus étrange à ce sujet, cela fonctionne parfaitement la moitié du temps! J'ai lu sur Internet que cela peut arriver si vous essayez de faire flotter () des choses qui ne sont pas des nombres ou qui contiennent de la merde bizarre, comme des espaces. Comme vous pouvez le voir, je pense que ce n'est pas le cas ici.

Quand j'essaye d'isoler le problème en exécutant une version simplifiée du programme comme celle-ci:

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

il produit -0.06 et fonctionne parfaitement ???

Donc je suis vraiment coincé ici. Cela devrait fonctionner, mais ce n'est pas le cas. Pire encore, cela fonctionne parfois , sans raison. Et quand j'isole le problème, cela fonctionne très bien.

Toute aide serait extrêmement appréciée!

Oh et si vous voulez voir le code entier , c'est ici: https://github.com/Madaxuorel/proj-ethTB /blob/master/ETHtradingbotV1.py


1 commentaires

ValueError: impossible de convertir la chaîne en float: '' : L'erreur indique que vous essayez de convertir une chaîne vide en float < / code>. Ajoutez une condition à ce que vous voulez faire sur une chaîne vide.


3 Réponses :


0
votes

Vous avez utilisé le mot-clé comme variable ici. C'est pourquoi parfois ça ne marche pas je suppose. Comme str (), list () est une méthode pour convertir une variable en liste. Essayez de renommer la variable comme ci-dessous, je suppose.

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


0 commentaires

1
votes

Ce message d'erreur ...

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

... implique que l'interpréteur Python n'a pas pu convertir une chaîne en float.


Vous étiez assez proche. text renvoie une chaîne et supprime le % , au lieu de string.split ('%') code > vous voulez list = string.split ('%') [0] .

Un exemple:

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]))

imprime:

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]))

Plus loin, find_element_by_xpath () n'identifiera qu'un seul élément, et en utilisant text vous obtiendrez une seule chaîne , donc string = "" .join (list) code> semble redondant.

Donc, pour supprimer le % , convertissez la chaîne en float et imprimez, votre La ligne de code effective sera:

99

Mise à jour

Vous voyez toujours l'erreur car l'élément avec le texte requis n'a pas été rendu dans le DOM lorsque la ligne de code est appelée. En guise de solution, vous devez induire WebDriverWait pour la visibilité_of_element_located () et vous pouvez utiliser ce qui suit Stratégie de localisation :

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

Remarque : Vous avez pour ajouter les importations suivantes:

ValueError: could not convert string to float: ''


2 commentaires

malheureusement, cela ne fonctionne toujours pas :( Traceback (dernier appel le plus récent): Fichier "C: \ Users \ pc adam \ Documents \ EISTI \ algoprog \ perso \ python \ fichiers \ btc \ ETHt‌ radingbotV1.py ", ligne 134, dans old_values ​​= float (browser.find_element_by_xpath ('// * [@ id =" draggableNavRi‌ ghtResizable "] / secti‌ on / section [2] / sectio‌ n [1] / div [ 3] / ul / li [1] ‌ / div [2] / div [6] / span'‌) .text.split ("%") [0] ‌) ValueError: impossible de convertir la chaîne en float : ''


@AdamLeRoux Consultez la réponse mise à jour et faites-moi savoir le statut



0
votes

Le texte renvoyé est une chaîne vide, il ne peut donc pas être converti en float . Ajouter un chèque

b = removeprc(a)
if b:
    print(float(b))
else:
    print('b is an empty string')


0 commentaires