Python:另一个&x27;非类型';对象没有属性错误
对于新手练习,我试图在html文件中找到meta标记并提取生成器,因此我这样做: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"})['
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
并将捕获的异常分配给nameTypeError
。由于代码不会抛出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"