Подтвердить что ты не робот

Механизировать форму выбора с использованием идентификатора

Я работаю над механизацией с помощью python.

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

Форма здесь не имеет имени. Как я могу проанализировать форму, используя ее id?

4b9b3361

Ответ 1

Я нашел это как решение для той же проблемы. br - объект механизации:

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

Я уверен, что метод счетчика циклов выше может быть сделан более питоническим, но это должно выбрать форму с атрибутом id="sblock".

Ответ 2

Улучшая бит на примере python412524, в документации указано, что это действительно так, и я нахожу его более чистым:

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

Ответ 3

Для любых будущих зрителей здесь другая версия, использующая аргумент predicate. Обратите внимание, что это может быть сделано в одну строку с лямбдой, если вы так наклонены:

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

br.select_form(predicate=is_sblock_form)

Источник: https://github.com/jjlee/mechanize/blob/master/mechanize/_mechanize.py#L462

Ответ 4

Попробуйте использовать: br.select_form(nr=0), где nr - номер формы (вам не нужно имя или идентификатор).

Ответ 5

попробуйте:

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

Он должен вернуть список всех идентификаторов формы с вашей страницы

Ответ 6

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 it, it works! upvote me if u like

Ответ 7

Вы можете использовать предикатный параметр функции select_form класса Browser. Вот так:

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