web-dev-qa-db-fra.com

mécaniser sélectionner le formulaire en utilisant l'id

Je travaille sur mécaniser avec du python.

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

Le formulaire ici n'a pas de nom. Comment puis-je analyser le formulaire en utilisant sa id?

21
sam

J'ai trouvé cela comme une solution au même problème. br est l'objet mécanisé:

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

Je suis sûr que la méthode du compteur de boucles ci-dessus pourrait être utilisée davantage en Pythonic, mais cela devrait sélectionner le formulaire avec l'attribut id="sblock".

21
python412524

Améliorant un peu l'exemple de python412524, la documentation indique que ceci est également valide, et je le trouve un peu plus clair:

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

Pour les futurs spectateurs, voici une autre version utilisant l'argument predicate. Notez que cela pourrait être transformé en une seule ligne avec un lambda, si vous le vouliez:

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

br.select_form(predicate=is_sblock_form)

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

7
Moshe

Essayez d’utiliser: br.select_form(nr=0), où nr est le numéro du formulaire (vous n’avez pas besoin du nom ni de l’identifiant).

3
marbdq

essayez avec:

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

Il devrait renvoyer une liste de tous les identifiants de formulaire de votre page.

2

Vous pouvez utiliser le paramètre de prédicat de la fonction select_form de la classe Browser. Comme ça:

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