2012-09-10 21 views
5

Estoy tratando de completar y enviar un formulario usando Python, pero no puedo recuperar la página resultante. He intentado con los métodos mechanize y urllib/urllib2 para publicar el formulario, pero ambos tienen problemas.Python no puede recuperar formularios con urllib o mecanizar

El formulario que intento recuperar está aquí: http://zrs.leidenuniv.nl/ul/start.php. La página está en holandés, pero esto es irrelevante para mi problema. Cabe destacar que la acción de formulario redirige al http://zrs.leidenuniv.nl/ul/query.php.

En primer lugar, este es el método urllib/urllib2 He intentado:

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() 

Sin embargo, cuando intento imprimir el código HTML recuperado consigo la página original, no el que la acción forma se refiere a. Entonces, cualquier indicio de por qué esto no envía el formulario sería muy apreciado.

Como lo anterior no funcionó, también traté de usar mecanizar para enviar el formulario. Sin embargo, esto resulta en una ParseError con el siguiente código:

import mechanize 

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

donde la última línea sale con lo siguiente: "ParseError: inesperado '-' carbón en la declaración". Ahora me doy cuenta de que este error puede indicar un error en la declaración DOCTYPE, pero como no puedo editar la página del formulario, no puedo probar diferentes declaraciones. Cualquier ayuda sobre este error también es muy apreciada.

Gracias de antemano por su ayuda.

Respuesta

1

Es porque la pieza DOCTYPE está mal formada.

También contiene algunas etiquetas extrañas como:

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

Trate validating la página ti mismo ...


No obstante, sólo puede quitarse la basura para hacer feliz mecaniza html analizador:

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

Gracias, esto funcionó! Gracias por su respuesta rápida. – GjjvdBurg

+0

Puedes quitar otras etiquetas también [usando BeautifulSoup] (http://stackoverflow.com/questions/5598524/can-i-remove-script-tags-with-beautifulsoup) – enkash

Cuestiones relacionadas