使用机械汤设置没有名称的表单元素的值

时间:2018-10-01 06:40:30

标签: beautifulsoup mechanicalsoup

我已经搜索了所有Mechanicalsoup和beautifulsoup文档,但无法弄清楚如何使用'id'设置表单元素的值(因为它没有名称)。

import mechanicalsoup
browser = mechanicalsoup.StatefulBrowser()

browser.open(my_url)

form = browser.select_form('form[id="login-form"]')

browser.get_current_form().print_summary()
userid = browser.get_current_page().find('input', id='text-userid')
form.set("text-userid", "user")

这让我-

<input class="login-text-box" id="text-userid" placeholder="Email" type="text" value=""/>
<input class="login-text-box" id="text-password" placeholder="Password" type="password" value=""/>
<input id="button-login" type="submit" value="Sign In"/>
<input id="remember-me-checkbox" name="rememberme" type="checkbox" value="rememberme"/>
LinkNotFoundError: No valid element named text-userid

我尝试通过id,CSS选择器和其他组合引用元素,但得到相同的错误。我可以通过以下方式获取实际标签(我发现它是解决与提交按钮类似问题的解决方案):

userid = browser.get_current_page().find('input', id='text-userid')

但是form.set()不直接接受标签。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

经过更多研究,我了解到在这种情况下我应该使用硒(而不是机械汤)。我使用了本指南,该指南完全满足了我的第一次尝试。

http://stanford.edu/~mgorkove/cgi-bin/rpython_tutorials/Scraping_a_Webpage_Rendered_by_Javascript_Using_Python.php

答案 1 :(得分:-1)

如果没有name属性,则提交表单时输入将毫无用处,因为将基于此name属性来计算表单数据。此输入很可能将由JavaScript使用,而不是由表单提交使用,MechanicalSoup将无法帮助您使用JavaScript。参见:

https://mechanicalsoup.readthedocs.io/en/stable/faq.html#form-submission-has-no-effect-or-fails

简而言之:您可能想改用Selenium