sam
sam

Reputation: 19164

mechanize select form using id

I am working on mechanize with python.

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

The form here does not have a name. How can I parse the form using it's id?

Upvotes: 25

Views: 40681

Answers (7)

roj4s
roj4s

Reputation: 281

You can use the predicate param of the function select_form of the Browser class. Like this:

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

Upvotes: 0

Manohar Reddy Poreddy
Manohar Reddy Poreddy

Reputation: 27395

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

Upvotes: 0

Moshe
Moshe

Reputation: 9839

For any future viewers, here's another version using the predicate argument. Note that this could be made into a single line with a lambda, if you were so inclined:

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

Upvotes: 8

marbdq
marbdq

Reputation: 1235

Try using: br.select_form(nr=0), where nr is the form number (you don't need the name or id).

Upvotes: 3

Dan
Dan

Reputation: 1986

Improving a bit on python412524's example, the documentation states that this is valid as well, and I find it a bit cleaner:

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

Upvotes: 15

python412524
python412524

Reputation: 266

I found this as a solution for the same problem. br is the mechanize object:

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

I'm sure the loop counter method above could be done more pythonic, but this should select the form with attribute id="sblock".

Upvotes: 23

Tudor Constantin
Tudor Constantin

Reputation: 26861

try with:

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

It should return a list of all form ids from your page

Upvotes: 1

Related Questions