Gjj*_*urg 5 python forms mechanize urllib urllib2
我正在尝试使用Python填写并提交表单,但我无法检索生成的页面.我已尝试使用mechanize和urllib/urllib2方法发布表单,但两者都遇到了问题.
我想要检索的表格是:http://zrs.leidenuniv.nl/ul/start.php.该页面是荷兰语,但这与我的问题无关.值得注意的是,表单操作重定向到http://zrs.leidenuniv.nl/ul/query.php.
首先,这是我尝试过的urllib/urllib2方法:
import urllib, urllib2
import socket, cookielib
url = 'http://zrs.leidenuniv.nl/ul/start.php'
params = {'day': 1, 'month': 5, 'year': 2012, 'quickselect' : "unchecked",
'res_instantie': '_ALL_', 'selgebouw': '_ALL_', 'zrssort': "locatie",
'submit' : "Uitvoeren"}
http_header = { "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.46 Safari/535.11",
"Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language" : "nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4" }
timeout = 15
socket.setdefaulttimeout(timeout)
request = urllib2.Request(url, urllib.urlencode(params), http_header)
response = urllib2.urlopen(request)
cookies = cookielib.CookieJar()
cookies.extract_cookies(response, request)
cookie_handler = urllib2.HTTPCookieProcessor(cookies)
redirect_handler = urllib2.HTTPRedirectHandler()
opener = urllib2.build_opener(redirect_handler, cookie_handler)
response = opener.open(request)
html = response.read()
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试打印检索到的html时,我得到的是原始页面,而不是表单操作引用的页面.因此,非常感谢任何提示,为什么这不提交表格.
由于上述方法不起作用,我还尝试使用mechanize提交表单.但是,这会导致ParseError,代码如下:
import mechanize
url = 'http://zrs.leidenuniv.nl/ul/start.php'
br = mechanize.Browser()
response = br.open(url)
br.select_form(nr = 0)
Run Code Online (Sandbox Code Playgroud)
最后一行以下列内容退出:"ParseError:unexpected' - '声明中的char'.现在我意识到这个错误可能表明DOCTYPE声明中有错误,但由于我无法编辑表单页面,因此我无法尝试不同的声明.任何有关此错误的帮助也非常感谢.
在此先感谢您的帮助.
这是因为DOCTYPE零件变形了。
它还包含一些奇怪的标签,例如:
<!Co Dreef / Eelco de Graaff Faculteit der Rechtsgeleerdheid Universiteit Leiden><!e-mail j.dreef@law.leidenuniv.nl >
Run Code Online (Sandbox Code Playgroud)
尝试自己验证页面...
尽管如此,你可以去掉垃圾,让 html 解析器机械化:
import mechanize
url = 'http://zrs.leidenuniv.nl/ul/start.php'
br = mechanize.Browser()
response = br.open(url)
response.set_data(response.get_data()[177:])
br.set_response(response)
br.select_form(nr = 0)
Run Code Online (Sandbox Code Playgroud)