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