2012-05-08 24 views
20

Estoy trabajando en mecanizar con python.mecanizar seleccionar formulario usando id

<form action="/monthly-reports" accept-charset="UTF-8" method="post" id="sblock"> 

El formulario aquí no tiene un nombre. ¿Cómo puedo analizar el formulario usando id?

Respuesta

2

tratan con:

[f.id for f in br.forms()] 

Debe devolver una lista de todos los identificadores de formulario de su página

+0

gracias pero se writtening lista en blanco – sam

3

Trate de usar: br.select_form(nr=0), donde NR es el número del formulario (que no es necesario el nombre o carné de identidad).

+1

dice que no nr forma coincidente – sam

+0

¿Usted ha intentado literalmente: br.select_form (nr = 0)? – marbdq

+0

sí. He intentado lo mismo. – sam

20

Encontré esto como una solución para el mismo problema. br es el objeto mecanizar:

formcount=0 
for frm in br.forms(): 
    if str(frm.attrs["id"])=="sblock": 
    break 
    formcount=formcount+1 
br.select_form(nr=formcount) 

Estoy seguro de que el método contador de bucle de arriba se podría hacer más Pythonic, pero esto debe seleccionar la forma con el atributo id="sblock".

14

La mejora un poco en el ejemplo de python412524, la documentación indica que esto es válido también, y se me hace un poco más limpia:

for form in br.forms(): 
    if form.attrs['id'] == 'sblock': 
     br.form = form 
     break 
+5

Algunos formularios no tienen una identificación. Usar 'form.attrs.get ('id')' en la sentencia if evita en su lugar un KeyError. – awatts

7

Para cualquier espectadores futuras, aquí es otra versión con el argumento predicate. Tenga en cuenta que esto podría hacerse en una sola línea con una lambda, si estuviera tan inclinado:

def is_sblock_form(form): 
    return "id" in form.attrs and form.attrs['id'] == "sblock" 

br.select_form(predicate=is_sblock_form) 

Fuente: https://github.com/jjlee/mechanize/blob/master/mechanize/_mechanize.py#L462

0
g_form_id = "" 


def is_form_found(form1): 
    return "id" in form1.attrs and form1.attrs['id'] == g_form_id 


def select_form_with_id_using_br(br1, id1): 
    global g_form_id 
    g_form_id = id1 
    try: 
     br1.select_form(predicate=is_form_found) 
    except mechanize.FormNotFoundError: 
     print "form not found, id: " + g_form_id 
     exit() 


# ... goto the form page, using br = mechanize.Browser() 

# now lets select a form with id "user-register-form", and print its contents 
select_form_with_id_using_br(br, "user-register-form") 
print br.form 


# that's it, it works! upvote me if u like 
0

Puede utilizar el parámetro predicado de la select_form función del navegador clase. De esta manera:

from mechanize import Browser, FormNotFoundError 

try: 
    br.select_form(predicate=lambda frm: 'id' in frm.attrs and frm.attrs['id'] == 'sblock') 
except FormNotFoundError: 
    print("ERROR: Form not Found") 
Cuestiones relacionadas