6

我搜索了所有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() 不直接接受标签。

谢谢你的帮助!

4

2 回答 2

3

经过更多研究,我了解到我应该在这种情况下使用 Selenium(不是机械汤)。我使用了本指南,它在第一次尝试时完全符合我的要求。

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

于 2018-10-02T02:51:25.157 回答
0

如果没有name属性,提交表单时输入将毫无用处,因为表单数据将基于此name属性计算。这个输入很可能会被 JavaScript 使用,而不是表单提交,MechanicalSoup 不会帮助你处理 JavaScript。看:

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

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

于 2019-01-02T09:41:24.990 回答