简体   繁体   中英

Attribute Error: 'NoneType' object has no attribute 'find'

I keep having issues when trying to run this code. Had some help but still not working. Please help :)

Full code :

#!/usr/bin/env python3
from __future__ import print_function
try:
    import pymarketcap
    import decimal
    from operator import itemgetter
    import argparse
except Exception as e:
    print('Make sure to install {0} (pip3 install {0}).'.format(str(e).split("'")[1]))
    exit()

# arguments and setup
parser = argparse.ArgumentParser()
parser.add_argument('-m','--minimum_vol',type=float,help='Minimum Percent volume per exchange to have to count',default=1)
parser.add_argument('-p','--pairs',nargs='*',default=[],help='Pairs the coins can be arbitraged with - default=all')
parser.add_argument('-c','--coins_shown',type=int,default=10,help='Number of coins to show')
parser.add_argument('-e','--exchanges',nargs='*',help='Acceptable Exchanges - default=all',default=[])
parser.add_argument('-s','--simple',help='Toggle off errors and settings',default=False,action="store_true")
args = parser.parse_args()
cmc = pymarketcap.Pymarketcap()
info = []
count = 1
lowercase_exchanges = [x.lower() for x in args.exchanges]
all_exchanges = not bool(args.exchanges)
all_trading_pairs = not bool(args.pairs)
coin_format = '{: <25} {: >6}% {: >10} {: >15} {: <10} {: <10} {: <15} {: <5}'

if not args.simple:
    print('CURRENT SETTINGS\n* MINIMUM_PERCENT_VOL:{}\n* TRADING_PAIRS:{}\n* COINS_SHOWN:{}\n* EXCHANGES:{}\n* ALL_TRADING_PAIRS:{}\n* ALL_EXCHANGES:{}\n'.format(args.minimum_vol,args.pairs,args.coins_shown,lowercase_exchanges,all_trading_pairs,all_exchanges))
# retrieve coin data
for coin in cmc.ticker():
    try:
        markets = cmc.markets(coin["id"])
    except Exception as e:
        markets = cmc.markets(coin["symbol"])
    best_price = 0

    best_exchange = ''
    best_pair = ''
    worst_price = 999999
    worst_exchange = ''
    worst_pair = ''
    has_markets = False
    for market in markets:
        trades_into = market["pair"].replace(str(coin["symbol"])," ").replace("-"," ")
        if market['percent_volume'] >= args.minimum_vol and market['updated'] and (trades_into in args.pairs or all_trading_pairs) and (market['exchange'].lower() in lowercase_exchanges or all_exchanges):
            has_markets = True
            if market['price_usd'] >= best_price:
                best_price = market['price_usd']
                best_exchange = market['exchange']
                best_pair = trades_into
            if market['price_usd'] <= worst_price:
                worst_price = market['price_usd']
                worst_exchange = market['exchange']
                worst_pair = trades_into
    if has_markets:
        info.append([coin['name'],round((best_price/worst_price-1)*100,2),worst_price,worst_exchange,worst_pair,best_price,best_exchange,best_pair])
    elif not args.simple:
        print(coin['name'],'had no markets that fit the criteria.')

    print('[{}/100]'.format(count),end='\r')
    count += 1

# show data
info = sorted(info,key=itemgetter(1))[::-1]
print(coin_format.format("COIN","CHANGE","BUY PRICE","BUY AT","BUY WITH","SELL PRICE","SELL AT","SELL WITH"))
for coin in info[0:args.coins_shown]:
    print(coin_format.format(*coin))

I keep getting this 2 errors :

  File "./run", line 33, in <module>
    markets = cmc.markets(coin["id"])
  File "/Users/alex/anaconda3/lib/python3.6/site-packages/pymarketcap/core.py", line 296, in markets
    marks = html.find(id="markets-table").find("tbody").find_all('tr')
AttributeError: 'NoneType' object has no attribute 'find'

During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "./run", line 35, in <module>
    markets = cmc.markets(coin["symbol"])
  File "/Users/alex/anaconda3/lib/python3.6/site-packages/pymarketcap/core.py", line 296, in markets
    marks = html.find(id="markets-table").find("tbody").find_all('tr')
AttributeError: 'NoneType' object has no attribute 'find'

Any help would be tremendously appreciated. Thank you Received some great help before on my previous question but still no solution yet.

Any help would be tremendously appreciated. Thank you Received some great help before on my previous question but still no solution yet.

I think the issue is that, if for some coin there is just nothing to be found (no matter if you use coin["id"] or coin["symbol"] ), which can be caused by dead links which are built into the ticker module (coinmarketcap.com/currencies/). In this case

markets = cmc.markets(coin["id"])

markets = cmc.markets(coin["symbol"])

will both throw an AttributeError. You should change your code to

for coin in cmc.ticker():
    try:
        # this call can fail
        markets = cmc.markets(coin["id"])
    except AttributeError as e:
        try:
            # second call could also fail
            markets = cmc.markets(coin["symbol"])
        except AttributeError as e1:
            print("Nothing found for " + coin["id"])
            continue #skip this coin?
    best_price = 0

I tried your code and it failed for a coin called janus for which, when you try the link manually, a PageNotFound is displayed, which would explain why it doesn't work to.

NoneType means that instead of an instance of whatever Class or Object you think you're working with, you've actually got None . That usually means that an assignment or function call up above failed or returned an unexpected result.

For Further investigation, I'd suggest you to print the response and it's type of the following expression:

for coin in cmc.ticker():
    try:
        markets = cmc.markets(coin["id"])
    except Exception as e:
        markets = cmc.markets(coin["symbol"])
    best_price = 0
print(markets)
print(type(markets))

This wont solve your problem, but might give you an insight of the Line of Code that is troubling you. And you can further debug it as to where you are getting it wrong. And if the problem persists, you can edit your question and post the further evaluated code/traceback call, which will help us(the community members) to help you in solving your problem.

Usually, there are data types in python which you cannot iterate through and might require to either typecast it in some way which is iterable(eg. Dictionaries, Lists) or use attributes to access a value at a given index in your case.

Hope it helps :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM