2011-12-20 18 views
7

Bene, sto cercando di accedere a un sito utilizzando Python e mechanize.Invio di moduli con Mechanize (Python)

Ho il sito ha aperto:

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

E io ho un elenco dei moduli (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)>> 

Ho cercato di inviare i campi nome utente e password.

Ho provato a fare in questo modo:

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

poi ho capito che le forme che stavano cercando di colmare, non sono stati i primi sulla pagina, ma cambiando il 0 non ha aiutato con qualsiasi cosa. Cosa devo fare per selezionare il modulo su una pagina come questa?

Tuttavia! Questo non è l'unico problema.

quando l'eseguo, ottengo questo errore:

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

Come posso risolvere questo problema? D: O lo sto facendo completamente storto? Se è il secondo, come potrei fare?

risposta

4

per selezionare un modulo utilizzando il suo nome si dovrebbe usare:

br.select_form(name="order") 

quello che state facendo qui:

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

sta tentando di impostare un valore su un controllo sotto il modulo selezionato, quindi quando non riesce a trovarlo, genera l'eccezione che stai vedendo.

+0

br.select_form (name = "username") restituisce un errore: FormNotFoundError: nessun modulo che corrisponde al nome 'username' - come prima, ma questa volta con la riga che ho appena aggiunto. – Matthew

+0

sei sicuro di avere il nome giusto? prova per form in br.forms(): modulo di stampa – tovmeod

+0

positivo. Ho controllato br.forms() e l'html grezzo. – Matthew

0

Si potrebbe avere diversi problemi

  • se il modulo è generato attraverso javascript, non si può risolvere con mechanize - almeno non in modo dritto in avanti - in questo caso vi consiglio di provare e usa selenium - puoi provare a guardare la sorgente HTML della pagina - se non hai il modulo lì in puro html, è abbastanza chiaro che è inserito in DOM da javascript. Inoltre, se il modulo viene inviato tramite JavaScript, meccanizzare non vi aiuterà a

  • anche, la forma non potrebbe essere nella prima pagina - si potrebbe desiderare di impostare meccanizzare di seguire i reindirizzamenti

+0

No, non è javascript. E potrei accedere al modulo bene con urllib ... preferirei usare meccanize perché non sono sicuro di come cookiejar funzioni esattamente e devo rimanere loggato> _> E login.php è il percorso del modulo. Sono certo di questo. – Matthew