打印工作正常时使用list.append()时出错

时间:2014-06-23 19:17:10

标签: python beautifulsoup

我试图制作一个简单的网络抓取工具,向我发送一封关于网站页面上发布的优惠的电子邮件。我正在使用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)

我很感激你的帮助。

由于

3 个答案:

答案 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)

回答了一个问题,因为人们会根据有效信息向您提供短信。

  1. 是的,你需要return来自该函数的数据,而不是print。因此print更改为return,您将设置(只要您返回字符串或清理数据)

  2. 这是调试代码的好课程。您的堆栈跟踪说明了问题,但您的标题会忽略它,其他一些也是如此。 .join()期望字符串类型,因此这是导致您发出问题的地方。

  3. 要调试奇怪的问题,你需要更加关注堆栈跟踪,这有点凌乱于prints(不要担心 - 我们之前都忽略了这些数据)。

    None是可以在列表中的有效类型。因此,当mylist.append(Foo())未返回任何内容时调用Foo,请将None添加到您的列表中。这完全有效。

    但是,实际问题是当您尝试拨打.join(ListWithNotStringsInIt)时。读取为:我给了.join()项目列表,其中至少有一个不是字符串,也不能隐式转换为字符串(str())。

    如何解决这个问题以避免将来发生问题? 清理数据

    列表理解是一种非常好的方法,但是如果你负责任地处理数据应该完全没有必要:

    '\n'.join([str(x) for x in my_list])
    

    Python希望您作为程序员明智地使用它。因此,您可以使用大量绳索(例如看到这样的错误)。

    此处不应要求列表理解,如果您有责任正确使用列表,则完全没必要。但这是一种检查你得到的东西的方法,特别是在抛出异常并且你正在调试问题的时候。