Intellipaat Back

Explore Courses Blog Tutorials Interview Questions
0 votes
2 views
in Data Science by (17.6k points)

I don't understand why it works with different scenarios, but not with this one. Basically, some gentleman helped me out HERE  with improving my code to scrape weather, which works perfectly. I then tried to do the same to scrape an ETH value which is in a span tag <span class="text-large2" data-currency-value="">$196.01</span>. So, I followed the same technique in the code, replaced the fields, and was hoping for it to work.

The code is here:

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

The output looks like this:

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'

Then, I finally tried it this way; but from here I get false positives, but no errors. It prints whatever it wants

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

Would the problem be that the value of the ETH has a $ sign inside the span tag? And, that way the program doesn't know what to do with string?

1 Answer

0 votes
by (41.4k points)

Here, you should cast the float to string to print it because you are getting a float and not an int. So, here are the changes needed as depicted in the code below:

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

Outputs:

LTC price is: 195.44

LTC price is: 195.44

If you wish to learn more about how to use python for data science, then go through this data science python course by Intellipaat for more insights.

31k questions

32.8k answers

501 comments

693 users

Browse Categories

...