python mechanize.browser 提交() 相关问题
我正在用 mechanize.browser 模块写一个脚本。
现在遇到一个问题,其他的都没问题,但在提交表单时,它不工作。
所以我查了一下源代码,发现了一些可疑的地方。
在 HTML 源代码中,我发现了这样的内容。
<form method="post" onsubmit="return loginCheck(this)" name="FRMLOGIN"/>
我在想,loginCheck(this) 可能是在提交表单时出问题的地方。
但是我该如何用 mechanize 模块处理这种 JavaScript 函数,这样我才能成功提交表单并收到结果呢?
以下是我目前的脚本源代码。
如果有人能帮我一下,我会非常感激!!
# -*- coding: cp949-*-
import sys,os
import mechanize, urllib
import cookielib
from BeautifulSoup import BeautifulSoup,BeautifulStoneSoup,Tag
import datetime, time, socket
import re,sys,os,mechanize,urllib,time
br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
# Browser options
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
# Follows refresh 0 but not hangs on refresh > 0
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
# Want debugging messages?
br.set_debug_http(True)
br.set_debug_redirects(True)
br.set_debug_responses(True)
# User-Agent (this is cheating, ok?)
br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.6')]
br.open('http://user.buddybuddy.co.kr/Login/LoginForm.asp?URL=')
html = br.response().read()
print html
br.select_form(name='FRMLOGIN')
print br.viewing_html()
br.form['ID']='zero1zero2'
br.form['PWD']='012045'
br.submit()
print br.response().read()
3 个回答
onsubmit 在 mechanize 中是被忽略的,也就是说它不会处理任何 JavaScript 的代码。
你需要检查一下 loginCheck(); 在某些特定情况下(比如验证),你可以通过编程的方式来实现 JavaScript 所做的事情。
mechanize根本不支持Javascript。如果你真的需要运行那些Javascript,可以考虑使用Selenium。它可以让你用Python来控制一个真正的浏览器,比如Firefox或IE。
你可以选择使用一个不再维护的模块 DOMForm 和 Spidermonkey (http://pypi.python.org/pypi/python-spidermonkey) 来处理 JavaScript。或者,你可以搞清楚 loginCheck() 这个函数在做什么,然后在提交表单之前用 Python 来完成它的工作。如果 loginCheck() 只是检查登录数据的基本有效性,那应该会比较简单。
请注意,提到的表单标签中的 action 参数缺失了。这个参数可能是在 JavaScript 部分给出的。
根据你的需求,可能只用 urllib2 会更简单。你可以假设那个网页的外观是静态的,然后直接用 urllib2 的方法发送数据,并获取结果。