0

对于新手练习,我试图在 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"

我得到的是同样的错误。

那我该怎么办?

4

2 回答 2

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"
于 2013-11-07T15:46:35.693 回答
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返回一个错误,并从结果中提取数据。NoneNone

于 2013-11-07T15:46:49.047 回答