I did some more digging, and I think I've solved my own problem.
When I grab the text from my linux setup, I see this (excerpt):
<TEXTAREA rows="5" cols="1500" id="messageArea"/><DIV class="hLine"/><DIV id="captcha"><IMG border="0" id="captchaImg"/></DIV> <DIV class="floatLeft"><LABEL><SPAN id="captchaLabel">*Please type the characters above: </SPAN>
...and when I do
foo=soup.findAll('textarea',{'id':'messageArea'})
foo contains basically the rest of the document - it's not seeing the closure of the text area.
When I view page source on my local desktop running Chrome, I see:
<textarea id="messageArea" cols="1500" rows="5"></textarea><div class="hLine"></div>
<div id="captcha"><img id="captchaImg" border="0"></div>
<div class="floatLeft">
<label>
<span id="captchaLabel">*Please type the characters above: </span>
Note the closure of the textarea.
So, I added this to my preprocessing of the html text before souping it:
text=re.sub(re.compile(r'<textarea.+?>', re.I|re.DOTALL), '', text)
...which kills the textarea tags, because I don't need 'em. Seems to have fixed the problem.