使用python,BeautifulSoup,mechanize设置HTML textarea内容(没有形式,只是div)

我正在尝试填写包含textarea元素的表单.我正在使用带有BeautifulSoap和机械化模块的
Python(在FreeBSD 8.1上使用最新模块在FreeBSD 8.1中使用2.6.5:BeautifulSoup 3.1.0.1和机械化0.2.1).

BeautifulSoap的问题是它没有正确设置textarea内容(我可以尝试soup.textarea.insert(0,“FOO”)甚至是soup.textarea.contents =“FOO”,但是一旦我用汤检查当前值.textarea,我仍然看到旧HTML标签,它们之间没有内容:

< textarea name =“classified_description”class =“classified_textarea_text”>< / textarea>

机械化的问题是它似乎只能在真实的形式上运作.根据我在下面解析的HTML,这不是一个真正的表单,而是一组内部带有输入项的div.

如何使用Python或其中任何一个模块来设置此textarea元素的值?

<div class="classified_field">
            <div class="classified_input_label">Description</div>
            <div class="classified_textarea_div">
                <textarea name="classified_description" id="classified_description" class="classified_textarea_text"></textarea>
            </div>
            <div class="site_clear"></div>
        </div>

我在下面尝试了弗拉基米尔的技术,虽然它适用于他的例子,但由于某种原因它在我的生产代码中不起作用.我可以使用.find()来获取textarea,但.insert()让我感到悲伤.这是我到目前为止所拥有的:

>>> soup.find('textarea', {'name': 'classified_description'})                  
<textarea name="classified_description" class="classified_textarea_text"></textarea>
>>> soup.find('textarea', {'name': 'classified_description'}).insert(0, "some text here")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.6/site-packages/BeautifulSoup.py", line 233, in insert
  newChild.nextSibling.previousSibling = newChild
AttributeError: 'unicode' object has no attribute 'previousSibling'
>>> 

任何人都知道为什么会通过unicode错误?很明显,我的汤对象不仅仅是一个unicode字符串,因为我成功使用了.find.

解:
Vladimir的解决方案是正确的,但是真实世界的HTML可能会在BeautifulSoup 3.1(official reason here)中生成格式错误的开始标记错误.降级到BeautifulSoup 3.0.8后,一切正常.当我发布最初的问题时,我不得不进行一些陪审团操作以使机械化读取()到BeautifulSoup对象中,以免发生格式错误的开始标记错误.这导致创建了uencode sting而不是BeautifulSoup对象.使用较旧的BeautifulSoup更正我的机械化代码已导致所需的行为.

最佳答案 以下是使用BeautifulSoup的示例:

from BeautifulSoup import BeautifulSoup

soup = BeautifulSoup('<textarea name="classified_description"></textarea>')
soup.find('textarea', {'name': 'classified_description'}).insert(0, 'value')
assert str(soup) == '<textarea name="classified_description">value</textarea>'

BeautifulSoup documentation on modifying the parse tree详细描述了这种转换.

点赞