使用 python、BeautifulSoup、mechanize 设置 HTML textarea 内容(没有表单,只有 div)

ham*_*x0r 5 python forms textarea mechanize beautifulsoup

我正在尝试填写包含 textarea 元素的表单。我将 Python 与 BeautifulSoap 和 mechanize 模块一起使用(在 FreeBSD 8.1 上停留在 2.6.5 和 FreeBSD 存储库中的最新模块:BeautifulSoup 3.1.0.1 和 mechanize 0.2.1)。

BeautifulSoap 的问题是它没有正确设置 textarea 内容(我可以尝试soup.textarea.insert(0, "FOO")甚至soup.textarea.contents = "FOO",但是一旦我使用 来检查当前值soup.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>
Run Code Online (Sandbox Code Playgroud)

我在下面尝试了 Vladimir 的技术,虽然它适用于他的示例,但由于某种原因它在我的生产代码中不起作用。我可以用来.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'
>>> 
Run Code Online (Sandbox Code Playgroud)

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

解决方案:Vladimir 的解决方案是正确的,但现实世界的 HTML 可能会malformed start tag在 BeautifulSoup 3.1 中产生错误(官方原因在这里)。降级到 BeautifulSoup 3.0.8 后,一切正常。当我发布最初的问题时,我不得不做一些陪审团操纵来机械化到read()BeautifulSoup 对象中,以免malformed start tag出现错误。这导致创建了一个 uencode 刺,而不是一个 BeautifulSoup 对象。使用旧的 BeautifulSoup 更正我的机械化代码导致了所需的行为。

Vla*_*mir 2

这是使用 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>'
Run Code Online (Sandbox Code Playgroud)

关于修改解析树的 BeautifulSoup 文档详细描述了此类转换。