One option that occurred to me is to loop through all nodes in the div and count the words in the nodeValue if it's a text node, or otherwise loop through the element's sub-nodes if it has them. You could do this recursively and therefore find all text nodes within the DIV and its sub-elements.
The problem is this doesn't cover everything. Inputs and textareas have a value, not a nodeValue. You will want to ignore any "script" elements and perhaps others. Of course you can set up a list of exceptions and modify the algorithm a bit to allow for them.
You must not worry about the text within the select options. From the DOM point of view they are not different form the texts within, say, a SPAN. But keep in mind that, in fact, in case of the SELECT elements, the text has no relevance. The value is important, not the text, because the value is submitted.