looks like an lxml bug to me, but according to design if you read the documentation. I've solved it like this:
def node_text(node):
if node.text:
result = node.text
else:
result = ''
for child in node:
if child.tail is not None:
result += child.tail
return result