对于新手练习,我试图在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"
我得到的是同样的错误。
那我该怎么办?
答案 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
中提取数据会导致错误。