b1694621
b1694621

Reputation: 3

I got aTypeError: 'NoneType' object is not iterable

in fucntion getLink(urls), I have return (cloud,parent,children) in main function, I have (cloud,parent,children) = getLink(urls) and I got error of this line: TypeError: 'NoneType' object is not iterable

parent and children are all list of http links. since, it is not able to paste them here, parent is a list contains about 30 links; children is a list contains about 30 items, each item is about 10-100 links which is divide by ",".

cloud is a list contain about 100 words, like that: ['official store', 'Java Applets Centre', 'About Google', 'Web History'.....]

I didnot know why I get an error. Is there anything wrong in passing parameter? Or because the list take too much space?

#crawler url: read webpage and return a list of url and a list of its name
def crawler(url):
    try:
        m = urllib.request.urlopen(url)
        msg = m.read()
....
        return (list(set(list(links))),list(set(list(titles))) )
    except Exception:
        print("url wrong!")

#this is the function has gone wrong: it throw an exception here, also the error I mentioned, also it will end while before len(parent) reach 100. 
def getLink(urls):
    try:
        newUrl=[]
        parent = []
        children =[]
        cloud =[]
        i=0

        while len(parent)<=100:

            url = urls[i]
            if url in parent:
                i += 1
                continue
            (links, titles) = crawler(url)
            parent.append(url)
            children.append(",".join(links))
            cloud = cloud + titles
            newUrl= newUrl+links
            print ("links: ",links)
            i += 1
            if i == len(urls):
                urls = list(set(newUrl))
                newUrl = []
                i = 0

        return (cloud,parent,children)
    except Exception:
        print("can not get links")


def readfile(file):
    #not related, this function will return a list of url 

def main():
    file='sampleinput.txt'
    urls=readfile(file)
    (cloud,parent,children) = getLink(urls)

if __name__=='__main__':
    main()

Upvotes: 0

Views: 1318

Answers (1)

Matthias
Matthias

Reputation: 13222

There might be a way that your function ends without reaching the explicit return statement.

Look at the following example code.

def get_values(x):
    if x:
        return 'foo', 'bar'

x, y = get_values(1)
x, y = get_values(0)

When the function is called with 0 as parameter the return is skipped and the function will return None.

You could add an explicit return as the last line of your function. In the example given in this answer it would look like this.

def get_values(x):
    if x:
        return 'foo', 'bar'
    return None, None

Update after seing the code

When the exception is triggered in get_link you just print something and return from the function. You have no return statement, so Python will return None. The calling function now tries to expand None into three values and that fails.

Change your exception handling to return a tuple with three values like you do it when everything is fine. Using None for each value is a good idea for it shows you, that something went wrong. Additionally I wouldn't print anything in the function. Don't mix business logic and input/output.

except Exception:
    return None, None, None

Then in your main function use the following:

cloud, parent, children = getLink(urls)
if cloud is None:
    print("can not get links")
else:
    # do some more work

Upvotes: 1

Related Questions