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)
而我得到的是同样的错误.
那我该怎么办?
该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)