By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
432,498 Members | 1,558 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 432,498 IT Pros & Developers. It's quick & easy.

Function returns none

P: n/a
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.

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)
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?

Oct 31 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a
On Mon, 2005-10-31 at 14:12, no****@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.

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)
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?


You have a lot of cases where findelement is called recursively and then
its return value is discarded instead of being turned into a return
value to the caller. In those cases, execution simply falls off the end
of the function and None is returned implicitly (and silently, since you
don't have a print "Returning None" at the end of the function).

HTH,

Carsten.
Oct 31 '05 #2

P: n/a
no****@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?

Oct 31 '05 #3

P: n/a
Thanks, that worked!

Oct 31 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.