【问题标题】:Setting HTML textarea contents with python, BeautifulSoup, mechanize (no forms, just divs)使用 python、BeautifulSoup、mechanize 设置 HTML textarea 内容(没有表单,只有 div)
【发布时间】:2012-08-12 05:22:22
【问题描述】:

我正在尝试填写一个包含 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>

我在下面尝试了 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'
>>> 

有人知道为什么会出现 unicode 错误吗?显然我的soup 对象不仅仅是一个unicode 字符串,因为我成功使用了.find

解决方案: Vladimir 的解决方案是正确的,但现实世界的 HTML 可能会在 BeautifulSoup 3.1 (official reason here) 中生成 malformed start tag 错误。降级到 BeautifulSoup 3.0.8 后,一切正常。当我发布最初的问题时,我不得不做一些陪审团绑定以将read() 机械化到 BeautifulSoup 对象中,以免出现malformed start tag 错误。这导致创建了一个 uencode 字符串,而不是一个 BeautifulSoup 对象。用旧的 BeautifulSoup 更正我的机械化代码导致了预期的行为。

【问题讨论】:

    标签: python forms textarea beautifulsoup mechanize


    【解决方案1】:

    这是一个使用 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 详细描述了此类转换。

    【讨论】:

    • 谢谢!您的示例对我有用,但生产代码会引发错误:AttributeError: 'unicode' object has no attribute 'previousSibling'。任何线索为什么?
    • 代码中的某处某个函数返回unicode,而您希望它返回汤标签对象。尝试自己调试(例如引入一些变量 refactoring.com/catalog/introduceExplainingVariable.html )。顺便说一句,最好也接受答案;)
    • 我希望我没有立即将您的回复标记为答案而不是粗鲁。问题仍然存在,所以我一直等到完全解决。我现在了解 BeautifulSoup 3.1 中的一个错误(请参阅我的帖子编辑)。您的答案是更好地构建 BeautifulSoup 的正确解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    相关资源
    最近更新 更多