2012-09-10 29 views
5

我想填写并使用Python提交表单,但是我无法检索生成的页面。我试过了mechanize和urllib/urllib2方法来发布表单,但都遇到了问题。Python无法使用urllib或机械化检索表单

我试图检索的表单在这里: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() 

然而,当我尝试打印检索到的HTML我得到的原始页面,而不是一个表单动作是指至。所以任何暗示,为什么这不提交表格将不胜感激。

因为上述不起作用,我还试图使用机械化来提交表单。然而,这导致与下面的代码ParseError:

import mechanize 

url = 'http://zrs.leidenuniv.nl/ul/start.php' 
br = mechanize.Browser() 
response = br.open(url) 
br.select_form(nr = 0) 

其中最后符合下列退出:“ParseError:意外‘ - ’字符在声明中”。现在我意识到这个错误可能表明DOCTYPE声明中有错误,但由于我无法编辑表单页,因此我无法尝试不同的声明。对此错误的任何帮助也非常感谢。

在此先感谢您的帮助。

回答

1

这是因为DOCTYPE部分格式不正确。

而且它包含了一些奇怪的标签,如:

<!Co Dreef/Eelco de Graaff Faculteit der Rechtsgeleerdheid Universiteit Leiden><!e-mail [email protected] > 

尝试validating自己的网页...


尽管如此,你可以脱掉垃圾,使机械化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) 
+0

谢谢,这工作!感谢您的快速回复。 – GjjvdBurg

+0

您可以剥离其他标签[使用BeautifulSoup](http://stackoverflow.com/questions/5598524/can-i-remove-script-tags-with-beautifulsoup) – enkash