python mechanize - 提交自定义表单

4 投票
2 回答
1437 浏览
提问于 2025-04-16 11:24

我正在用 mechanize 处理一个需要登录的页面。这个页面在前端使用了一些 JavaScript,这让直接使用 mechanize 变得更加困难。我知道我需要提交哪个表单来登录——就是那个每次都由 JavaScript 生成的表单,内容是一样的。我该怎么做才能让 mechanize 提交一个不在页面上的自定义表单呢?这基本上相当于 这个 Perl 的问题,不过我想用 Python 来实现。

2 个回答

0

解析网页,提取你需要的元素,重新整理网页,然后把它们放回到mechanize里。

我之前做的一个项目中,需要使用一个模拟浏览器,但发现Mechanize在处理表单方面表现得很糟糕。它会把JavaScript代码块中的一些元素直接拿出来,然后就崩溃了。我不得不写一个解决办法,使用BeautifulSoup来去掉那些会导致崩溃的部分,这样才能让它顺利到达表单解析的环节。

你可能会遇到这个问题,也可能不会,但这点要记住。最后我放弃了Mechanize,转而使用Selenium。它的表单处理能力要强得多,而且能处理JavaScript。虽然它也有一些问题(因为浏览器增加了复杂性),但我觉得用起来简单多了。

5

(注意:这个问题最近又出现了,我现在实际上已经让它工作了。)

看起来这样做是有效的:

br.open(URL)
res = mechanize._form.ParseString(FORM_HTML, BASE_URL)
br.form = res[1]
#continue as if the form was on the page and selected with .select_form()
br['username'] = 'foo'
br['password'] = 'bar'
br.submit()

URL 是你访问的网站的完整网址。BASE_URL 是这个网址所在的目录。FORM_HTML 是包含 form 元素的任何 HTML,比如:

<form method='post' action='/login.aspx'>
    <input type='text' name='username'>
    <input type='text' name='password'>
    <input type='hidden' name='important_js_thing' value='processed_with_python TM'>
</form>

出于某种原因,mechanize._form.ParseString 返回了两个表单。第一个是一个没有输入的 GET 请求,指向基本网址;第二个是从 FORM_HTML 正确解析出来的表单。

撰写回答