Python:另一个&x27;非类型';对象没有属性错误

Python:另一个&x27;非类型';对象没有属性错误,python,error-handling,beautifulsoup,Python,Error Handling,Beautifulsoup,对于新手练习,我试图在html文件中找到meta标记并提取生成器,因此我这样做: Version = soup.find("meta", {"name":"generator"})['content'] 既然我犯了这个错误: TypeError: 'NoneType' object has no attribute '__getitem__' 我认为处理异常会纠正它,所以我写道: try: Version = soup.find("meta", {"name":"generator"})['

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

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"
我得到的是同样的错误

那我该怎么办

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

[…]
项访问语法查找
\uuu getitem\uuuuu
方法,该方法是
属性错误的来源,如下所示:

>>> None[1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object has no attribute '__getitem__'
如果使用括号对异常进行分组,则异常处理也会起作用:

try:
    Version = soup.find("meta", {"name":"generator"})['content']
except (NameError, TypeError):
    print "Not found"
如果没有括号,您将告诉Python捕获
namererror
异常,并将生成的异常对象分配给本地名称
TypeError
。此
异常除外,名称:
语法已被弃用,因为它可能导致您认为捕获到两个异常的情况

但是,这里的代码不应该抛出
namererror
异常;这是一个单独的问题,最好通过正确地实例化变量来解决;以下内容在这里也同样适用:

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

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

问题是,如果未找到匹配项,则返回一个
None
,从
None
中提取数据会导致错误。

听起来像是
soup.find()
正在返回
None
。根据,这意味着它什么也没有找到。在某些情况下,metatag不存在,这就是为什么我想测试它,如果它存在,我就打印它,如果没有,我就打印另一条消息。谢谢它的工作。因此,没有办法缩短代码并避免使用两个变量(版本和内容)?为什么要这样做?这是可读的,而且很简单。。但是如果您坚持,您可以只做
Version=Version.get('content')
谢谢您的详细解释。为了进一步展开,您使用的
除了NameError,TypeError
是捕获
NameError
并将捕获的异常分配给name
TypeError
。由于代码不会抛出
namererror
,因此除了
之外的
将永远不会捕获任何内容。
content = None
Version = soup.find("meta", {"name":"generator"})
if Version:
    content = Version.get('content') 
    #or even
    #Version = Version.get('content')
else:
    print "Not found"