使用list.append()时出错,打印正常
我正在尝试制作一个简单的网页抓取工具,它可以给我发送电子邮件,告诉我某个网站上发布的优惠信息。我使用了beautifulsoup这个库来把信息抓取到一个叫“list”的列表里。我可以通过打印命令让输出看起来像我想要的样子,但当我尝试用相同的循环把字符串添加到列表里时,就出现了以下错误。
> ----- Post with most thanks ------ Traceback (most recent call last):
> ----- Trending Hot Deals ------ File "C:/Users/Geoff/PycharmProjects/web_scraping/Historian_file.py", line
> 45, in <module>
> ----- Popular Threads ------
> print "\n".join(msg)
> ----- New Posts ------ TypeError: sequence item 0: expected string, NoneType found
>
> Process finished with exit code 1
这是我的代码,注释掉的部分不工作,而打印命令是可以的。
def title(number):
if number == 1:
print "----- Post with most thanks ------"
elif number == 2:
print "----- Trending Hot Deals ------"
elif number == 3:
print "----- Popular Threads ------"
else:
print "----- New Posts ------"
msg = []
x = 1
for i in list:
print title(x)
#msg.append(title(x))
x = x+1
for j in i:
l = j.encode_contents()
print l
#msg.append(l)
#print "\n".join(msg)
我很感谢任何帮助。
谢谢
3 个回答
我把这个内容移到答案部分,因为大家给的信息不够全面。
是的,你需要从函数中
返回
数据,而不是打印
它。所以把print
改成return
,这样就可以了(只要你返回的是字符串,或者对数据进行处理)这是一个很好的调试代码的教训。你的错误信息已经说明了问题,但你的标题和其他一些人都忽略了这一点。
.join()
期望的是字符串类型,所以这就是你遇到问题的地方。
要调试奇怪的问题,你需要更加关注错误信息,虽然这些信息可能被print
的输出弄得有点乱(别担心,我们大家之前都忽略过这些数据)。
None
是一个有效的类型,可以出现在列表中。因此,当你调用mylist.append(Foo())
时,如果Foo
什么都不返回,就会把None
添加到你的列表中。这是完全有效的。
不过,你真正的问题在于你尝试调用.join(ListWithNotStringsInIt)
。可以理解为:我给.join()
一个包含项目的列表,其中至少有一个不是字符串,也不能隐式转换为字符串(str()
)。
为了避免将来出现问题,你应该处理好你的数据。
列表推导式是一个很好的方法来做到这一点,不过如果你负责任地处理数据,这其实是完全不必要的:
'\n'.join([str(x) for x in my_list])
Python希望你作为程序员能够明智地使用它。因此,你会有很多自由度(比如看到这样的错误信息)。
在这里不应该需要使用列表推导式,如果你正确使用列表,这其实是完全不必要的。但这是一种检查你得到的内容的方法,特别是在抛出异常和调试问题时。
你的 title
函数没有返回任何东西,所以当你试图把调用这个函数的结果加到其他内容上时,其实你并没有加上 title
的结果。相反,你加上的是 None
。要解决这个问题,你需要让函数返回结果,而不是仅仅打印出来。
在
print
语句改成return
。
def title(number):
if number == 1:
return "----- Post with most thanks ------"
elif number == 2:
return "----- Trending Hot Deals ------"
elif number == 3:
return "----- Popular Threads ------"
else:
return "----- New Posts ------"
记住,任何没有return
语句的函数,最后都会返回None
。