在功能getLink(urls)
中,我有return (cloud,parent,children)
在main函数中,我有(cloud,parent,children) = getLink(urls)
并且我得到了这一行的错误:TypeError:'NoneType'对象不可迭代
父级和子级都是http链接的list
。既然,它不能在这里粘贴它们,parent是一个包含大约30个链接的列表; children是一个包含大约30个项目的列表,每个项目大约是10-100个链接,除以“,”。
我不知道为什么会收到错误。传递参数有什么不对吗?或者因为列表占用太多空间?
#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()
答案 0 :(得分:1)
可能有一种方法可以使您的函数在没有到达显式return
语句的情况下结束。
请查看以下示例代码。
def get_values(x):
if x:
return 'foo', 'bar'
x, y = get_values(1)
x, y = get_values(0)
当使用0
作为参数调用函数时,将跳过return
,函数将返回None
。
您可以添加一个显式return
作为函数的最后一行。在这个答案给出的例子中,它看起来像这样。
def get_values(x):
if x:
return 'foo', 'bar'
return None, None
查看代码后更新
在get_link
中触发异常时,您只需打印一些内容并从该函数返回。您没有return
语句,因此Python将返回None
。调用函数现在尝试将None
扩展为三个值,但失败了。
更改您的异常处理以返回具有三个值的元组,就像您在一切正常时一样。对每个值使用None
是一个好主意,它会向您显示出错的地方。另外,我不会在函数中打印任何内容。不要混淆业务逻辑和输入/输出。
except Exception:
return None, None, None
然后在您的主函数中使用以下内容:
cloud, parent, children = getLink(urls)
if cloud is None:
print("can not get links")
else:
# do some more work