For a newbie exercise , I am trying to find the meta tag in a html file and extract the generator so I did like this :
Version = soup.find("meta", {"name":"generator"})['content']
and since I had this error :
TypeError: 'NoneType' object has no attribute '__getitem__'
I was thinking that working with exception would correct it, so I wrote :
try: Version = soup.find("meta", {"name":"generator"})['content'] except NameError,TypeError: print "Not found"
and what I got is the same error.
What should I do then ?
The soup.find()
method did not find a matching tag, and returned None
.
The [...]
item access syntax looks for a __getitem__
method, which is the source of the AttributeError
here:
>>> None[1] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'NoneType' object has no attribute '__getitem__'
Test for None
explicitly:
Version = soup.find("meta", {"name":"generator"}) if Version is not None: Version = Version['content'] else: print "Not found"
Your exception handling would work too, provided you use parenthesis to group the exceptions:
try: Version = soup.find("meta", {"name":"generator"})['content'] except (NameError, TypeError): print "Not found"
Without parenthesis you are telling Python to catch NameError
exceptions and assign the resulting exception object to the local name TypeError
. This except Exception, name:
syntax has been deprecated because it can lead to exactly your situation, where you think you are catching two exceptions.
However, your code here should not throw a NameError
exception; that'd be a separate problem better solved by instantiating your variables properly; the following would work just as well here:
try: Version = soup.find("meta", {"name":"generator"})['content'] except TypeError: # No such meta tag found. print "Not found"
Try this:
content = None Version = soup.find("meta", {"name":"generator"}) if Version: content = Version.get('content') #or even #Version = Version.get('content') else: print "Not found"
The issue is, soup.find
returns a None
if match was not found, and extracting data out of None
results in error.