web-dev-qa-db-fra.com

ValueError: littéral non valide pour int () avec la base 10: '196.41'

Je ne comprends pas pourquoi cela fonctionne avec différents scénarios, mais pas avec celui-ci. Fondamentalement, un gentleman m'a aidé ICI avec l'amélioration de mon code pour gratter la météo, ce qui fonctionne parfaitement. J'ai ensuite essayé de faire de même pour gratter une valeur ETH qui est dans une balise span <span class="text-large2" data-currency-value="">$196.01</span>. J'ai donc suivi la même technique dans le code, remplacé les champs et espérais que cela fonctionnerait.

Le code est ici:

import requests
from BeautifulSoup import BeautifulSoup
import time

url = 'https://coinmarketcap.com/currencies/litecoin/'

def ltc():
    while (True):
        response = requests.get(url)
        soup = BeautifulSoup(response.content)
        price_now = int(soup.find("div", {"class": "col-xs-6 col-sm-8 col-md-4 text-left"}).find(
        "span", {"class": "text-large2"}).getText())
        print(u"LTC price is: {}{}".format(price_now))
        # if less than 150
        if 150 > price_now:
            print('Price is Low')
        # if more than 200
        Elif 200 < price_now:
            print('Price is high')

if __name__ == "__main__":
    ltc()

La sortie ressemble à ceci:

Traceback (most recent call last):
  File "test2.py", line 24, in <module>
    ltc()
  File "test2.py", line 13, in ltc
    "span", {"class": "text-large2"}).getText())
ValueError: invalid literal for int() with base 10: '196.01'

Ensuite, je l'ai finalement essayé de cette façon; mais à partir d'ici, j'obtiens de faux positifs, mais pas d'erreurs. Il imprime ce qu'il veut

import requests
from bs4 import BeautifulSoup
import time

url = 'https://coinmarketcap.com/currencies/litecoin/'

def liteCoin():
    while (True):
        response = requests.get(url)
        html = response.text
        soup = BeautifulSoup(html, 'html.parser')
        value = soup.find('span', {'class': 'text-large2'})
        print(''.join(value.stripped_strings))
        if 150 > value:         # if less than 150
            print('Price is Low!')
        Elif 200 < value:       # if more than 200
            print('Price is High')
        else:
            print('N/A')
        time.sleep(5)

if __name__ == "__main__":
    liteCoin()

Le problème serait-il que la valeur de l'ETH a un $ signe à l'intérieur du span tag? Et, de cette façon, le programme ne sait pas quoi faire avec la chaîne?

4
uzdisral

Tout d'abord, simplifions votre exemple de programme:

>>> int('196.01')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '196.01'

On ne peut pas convertir la chaîne '196.01' à un nombre entier.

Essaye ça:

>>> int(float('196.01'))
196

En passant du simple dos au complexe, nous pouvons le faire:

#UNTESTED
price_now = int(float(soup.find("div", {"class": "col-xs-6 col-sm-8 col-md-4 text-left"}).find(
    "span", {"class": "text-large2"}).getText()))
4
Robᵩ

Vous devez comprendre les types dans Python vous obtenez un float et non un int et vous devez convertir le float en une chaîne pour l'imprimer. Il y a donc deux changements nécessaires.

    price_now = float(soup.find("div", {"class": "col-xs-6 col-sm-8 col-md-4 text-left"}).find("span", {"class": "text-large2"}).getText())
    print(u"LTC price is: {}".format(str(price_now)))

Les sorties:

LTC price is: 195.44
LTC price is: 195.44
2
Dan-Dev