2011-12-20 29 views
7

Bueno, estoy tratando de iniciar sesión en un sitio usando Python y mecanizar.Envío de formularios con Mechanize (Python)

Tengo el sitio abrió:

site = br.open("http://example.com/login.php") 

Y tengo una lista de las formas (con br.forms).

<GET http://example.com/search.php application/x-www-form-urlencoded 
<HiddenControl(search=1) (readonly)> 
... 
<POST http://example.com/login.php application/x-www-form-urlencoded 
<TextControl(username=)> 
<PasswordControl(password=)> 
<CheckboxControl(stay=[1])> 
<SubmitControl(<None>=Log in) (readonly)>> 

He intentado enviar los campos de nombre de usuario y contraseña.

Traté de hacerlo de esta manera:

br.select_form(nr=0) 
br.form["username"] = 'usernamehere' 
br.form["password"] = 'passwordhere' 
br.submit() 

Entonces me di cuenta que las formas que estaban tratando de llenar no fueron los primeros en la página, pero cambiando el 0 no ayudó en nada. ¿Qué debo hacer para seleccionar el formulario en una página como esta?

¡Sin embargo! Ese no es el único problema.

Cuando corro, me sale este error:

Traceback (most recent call last): 
File "C:\Python26\login.py", line 34, in <module> 
br.form["username"] = 'usernamehere' 
... 
ControlNotFoundError: no control matching name 'username' 

¿Cómo puedo solucionar este problema? D: ¿O lo estoy haciendo totalmente mal? Si es el último, ¿cómo lo haré?

Respuesta

4

para seleccionar un formulario utilizando su nombre se debe utilizar:

br.select_form(name="order") 

lo que está haciendo aquí:

br.form["username"] = 'usernamehere' 

está tratando de establecer un valor para un control en el formulario seleccionado, por lo que cuando no puede encontrarlo, arroja la excepción que está viendo.

+0

br.select_form (name = "username") devuelve un error: FormNotFoundError: ningún nombre que coincida con el nombre 'username' - igual que antes, pero esta vez con la línea que acabo de agregar. – Matthew

+0

¿Estás seguro de que tienes el nombre correcto? intente con la forma en br.forms(): imprima el formulario – tovmeod

+0

Positivo. Comprobé br.forms() y el html crudo. – Matthew

0

Es posible que tenga varios temas

  • si se genera la forma a través de JavaScript, no se puede resolver con mechanize - al menos no de una manera recta hacia adelante - en este caso, os recomiendo probar y use selenium - puede intentar ver la fuente HTML de la página - si no tiene el formulario allí en html puro, está bastante claro que está insertado en DOM por javascript. Además, si el formulario se envía a través de JavaScript, mecanizar no le ayudará a

  • también, la forma no puede ser que en la primera página - es posible que desee establecer mecanizar seguir las redirecciones

+0

No, no es javascript. Y pude acceder bien al formulario con urllib ... Preferiría usar mechanize porque no estoy seguro de cómo funciona cookiejar exactamente y necesito permanecer conectado> _> Y login.php es la ubicación del formulario. Estoy seguro de esto. – Matthew

Cuestiones relacionadas