Python:另一个'NoneType'对象没有属性错误

时间:2013-11-07 15:43:37

标签: python error-handling beautifulsoup

对于新手练习,我试图在html文件中找到元标记并提取生成器,所以我这样做:

Version = soup.find("meta", {"name":"generator"})['content']

因为我有这个错误:

TypeError: 'NoneType' object has no attribute '__getitem__'

我以为使用异常会纠正它,所以我写道:

try: Version = soup.find("meta", {"name":"generator"})['content']

except NameError,TypeError:

     print "Not found"

我得到的是同样的错误。

那我该怎么办?

2 个答案:

答案 0 :(得分:7)

soup.find()方法找不到匹配的标记,并返回None

[...]项访问语法会查找__getitem__方法,该方法是此处AttributeError的来源:

>>> None[1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object has no attribute '__getitem__'

明确地测试None

Version = soup.find("meta", {"name":"generator"})
if Version is not None:
    Version = Version['content']
else:
    print "Not found"

如果您使用括号对异常进行分组,您的异常处理也会起作用:

try:
    Version = soup.find("meta", {"name":"generator"})['content']
except (NameError, TypeError):
    print "Not found"

如果没有括号,您会告诉Python捕获NameError个异常,并将生成的异常对象分配给本地名称TypeError。此except Exception, name:语法已被弃用,因为它可以准确地导致您的情况,您认为您正在捕获两个例外。

但是,此处的代码不应抛出NameError异常;这是一个单独的问题,通过适当地实例化你的变量可以更好地解决;以下内容也适用于此:

try:
    Version = soup.find("meta", {"name":"generator"})['content']
except TypeError:
    # No such meta tag found.
    print "Not found"

答案 1 :(得分:4)

试试这个:

content = None
Version = soup.find("meta", {"name":"generator"})
if Version:
    content = Version.get('content') 
    #or even
    #Version = Version.get('content')
else:
    print "Not found"

问题是,soup.find如果找不到匹配则会返回None,并且从None中提取数据会导致错误。