Function returns none

Kent Johnson kent37 at tds.net
Mon Oct 31 14:39:31 EST 2005


noahlt at gmail.com wrote:
> I'm trying to write a website updating script, but when I run the
> script, my function to search the DOM tree returns None instead of what
> it should.

When you call findelement() recursively you have to return the value from the recursive call to the next caller up. See example below.

Kent

> 
> I have this program:
> --------
> import sys
> from xml.dom.minidom import parse
> 
> 
> # search the tree for an element with a particular class
> 
> def findelement(current, classtofind, topnode = None):
>     if topnode == None: topnode = current
> 
> 
> 
>     # if it's an xml element...
>     if current.nodeType == 1:
>         print current.nodeName, ':', current.getAttribute('class')
>         if current.getAttribute('class') == classtofind:
>             print 'Returning node:', current
>             return current
>         elif current.hasChildNodes():
>             findelement(current.firstChild, classtofind, topnode)

Should be
  return findelement(current.firstChild, classtofind, topnode)
and similarly wherever you call findelement().

>         elif current.nextSibling:
>             findelement(current.nextSibling, classtofind, topnode)
> 
>         elif (current.parentNode != topnode) \
> 
>                  and (current.parentNode.nextSibling != None):
> 
>             findelement(current.parentNode.nextSibling, classtofind,
> topnode)
>         else:
> 
>             print 'Returning None...'
> 
>             return None
> 
>     # others (text, comment, etc)
> 
>     else:
> 
>         if current.nextSibling:
> 
>             findelement(current.nextSibling, classtofind, topnode)
> 
>         elif (current.parentNode != topnode) \
> 
>                  and (current.parentNode.nextSibling != None):
> 
>             findelement(current.parentNode.nextSibling, classtofind,
> topnode)
>         else:
> 
>             print 'Returning None...'
> 
>             return None
> 
> 
> 
> # parse the document
> 
> blog = parse('/home/noah/dev/blog/template.html')
> 
> 
> 
> # find a post
> 
> postexample = findelement(blog.documentElement, 'post')
> 
> 
> 
> print 'Got node:       ', postexample
> 
> -----
> 
> My output is this:
> 
> -----
> html :
> head :
> title :
> body :
> h1 :
> ul :
> li :
> h2 :
> ol :
> li : post
> Returning node: <DOM Element: li at -0x48599c74>
> Got node:        None
> -----
> 
> The function finds the right element fine, and says it will return <DOM
> Element: li at -0x48599c74>, but the program gets None instead.  What's
> happening here?  Any suggestions?
> 



More information about the Python-list mailing list