Using nodes as opposed to innerHTML. With nodes you can distinguish between text and elements.
// reference to first div
var div = document.getElementsByTagName('div')[0];
// reference to first p in first div
var p = div.getElementsByTagName('p')[0];
// get p text using nodes
var pText = p.childNodes[0].nodeValue;
// reference to first span in first div
var span = div.getElementsByTagName('span')[0];
// get span text
var spanText = span.childNodes[0].nodeValue;
The difference between using nodes and innerHTML is you can get just text if you so wish. Using this method you can bypass any HTML contained in a element and get raw text.
HTML
<p>
2002
<span>2003</span>
2004
</p>
Javascript
var pText = "";
for(var i=0,l=p.childNodes.length;i<l;i++) {
var node = p.childNodes[i];
// if node is a text node
if(node.nodeType===3)
{ pText += node.nodeValue.trim(); }
}
// 20022004
window.alert(pText)
See more on Node and Node.nodeType.
$('div#test p').html()