2012-05-08 12 views
20

Pracuję nad mechanizacją z python.mechanize wybierz formularz za pomocą id

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

Formularz tutaj nie ma nazwy. Jak mogę przeanalizować formularz przy użyciu jego nazwy: id?

Odpowiedz

2

spróbuj:

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

Należy zwrócić listę wszystkich identyfikatorów formularza ze strony

+0

dzięki ale jest writtening pustą listę – sam

3

Spróbuj użyć: br.select_form(nr=0), gdzie NR jest numer formularza (nie trzeba nazwę lub ID).

+1

mówi nie forma dopasowywania nr – sam

+0

Czy próbowałeś dosłownie: br.select_form (nr = 0)? – marbdq

+0

tak. próbowałem tego samego. – sam

20

Znalazłem to jako rozwiązanie dla tego samego problemu. br jest przedmiotem Mechanize:

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

jestem pewien sposób licznik pętli powyżej można zrobić więcej pythonic, ale to powinien wybrać formularz z atrybutem id="sblock".

14

Poprawa nieco na przykład python412524 jest dokumentacja wskazuje, że jest to ważne, jak również, i uważam, że to trochę bardziej czytelne:

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

Niektóre formularze nie mają identyfikatora. Użycie 'form.attrs.get ('id')' w instrukcji if pozwala uniknąć KeyError. – awatts

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

Można użyć param źródłowe z select_form funkcji w przeglądarce klasa. Tak:

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") 
Powiązane problemy