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

4m1*_*4j1 0 python error-handling beautifulsoup

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

Version = soup.find("meta", {"name":"generator"})['content']
Run Code Online (Sandbox Code Playgroud)

因为我有这个错误:

TypeError: 'NoneType' object has no attribute '__getitem__'
Run Code Online (Sandbox Code Playgroud)

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

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

except NameError,TypeError:

     print "Not found"
Run Code Online (Sandbox Code Playgroud)

而我得到的是同样的错误.

那我该怎么办?

Mar*_*ers 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__'
Run Code Online (Sandbox Code Playgroud)

None明确测试:

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

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

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

如果没有括号,则告诉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"
Run Code Online (Sandbox Code Playgroud)