我试图制作一个简单的网络抓取工具,向我发送一封关于网站页面上发布的优惠的电子邮件。我正在使用beautifulsoup将信息写入名为" list"的列表中。我可以使用print命令查看输出,但是当我尝试使用相同的循环将字符串附加到列表中时,我得到以下错误
> ----- 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)
我很感激你的帮助。
由于
答案 0 :(得分:0)
在print
函数中更改return
上的title
语句。
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
。
答案 1 :(得分:0)
您的title
函数没有返回任何内容,因此当您尝试附加调用该函数的结果时,您实际上并未实际附加title
的结果。相反,您要附加None
。要解决此问题,您需要返回它们,而不是简单地打印它们。
答案 2 :(得分:0)
回答了一个问题,因为人们会根据有效信息向您提供短信。
是的,你需要return
来自该函数的数据,而不是print
。因此将print
更改为return
,您将设置(只要您返回字符串或清理数据)
这是调试代码的好课程。您的堆栈跟踪说明了问题,但您的标题会忽略它,其他一些也是如此。 .join()
期望字符串类型,因此这是导致您发出问题的地方。
要调试奇怪的问题,你需要更加关注堆栈跟踪,这有点凌乱于prints
(不要担心 - 我们之前都忽略了这些数据)。
None
是可以在列表中的有效类型。因此,当mylist.append(Foo())
未返回任何内容时调用Foo
,请将None
添加到您的列表中。这完全有效。
但是,实际问题是当您尝试拨打.join(ListWithNotStringsInIt)
时。读取为:我给了.join()
项目列表,其中至少有一个不是字符串,也不能隐式转换为字符串(str()
)。
如何解决这个问题以避免将来发生问题? 清理数据。
列表理解是一种非常好的方法,但是如果你负责任地处理数据应该完全没有必要:
'\n'.join([str(x) for x in my_list])
Python希望您作为程序员明智地使用它。因此,您可以使用大量绳索(例如看到这样的错误)。
此处不应要求列表理解,如果您有责任正确使用列表,则完全没必要。但这是一种检查你得到的东西的方法,特别是在抛出异常并且你正在调试问题的时候。