What you're talking about sounds something like a DOM Range, which is implemented in all the major browsers except Internet Explorer. Specifying a location in terms of character offsets within HTML is not a good idea, since implementations of innerHTML vary significantly. A DOM Range has a start and end boundary, each of which is specified in terms of a node and an offset within that node. In the case of your example, you could create a Range that represented the location:
var span = pNode.childNodes[1];
var spanText = span.firstChild;
var range = document.createRange();
// Next line takes into account whitespace at the start of the text node
range.setStart(spanText, 6);
// For illustration, create a range that contains the letter "a" and selects it
range.setEnd(spanText, 7);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
Once you have a Range, you can use it for various things, such as inserting nodes, defining user selections and applying formatting to the content encapsulated by the Range.
IE defines an entirely different object called a TextRange that has a fundamentally different text-based approach but serves much the same purpose. To get the equivalent TextRange to the previous example, you could use the following:
var textRange = document.body.createTextRange();
textRange.moveToElementText(pNode);
textRange.moveStart("character", 17);
textRange.collapse();
// For illustration, create a range that contains the letter "a" and selects it
textRange.moveEnd("character", 1);
textRange.select();