Я работаю над механизацией с помощью python.
<form action="/monthly-reports" accept-charset="UTF-8" method="post" id="sblock">
Форма здесь не имеет имени. Как я могу проанализировать форму, используя ее id
?
Я работаю над механизацией с помощью python.
<form action="/monthly-reports" accept-charset="UTF-8" method="post" id="sblock">
Форма здесь не имеет имени. Как я могу проанализировать форму, используя ее id
?
Я нашел это как решение для той же проблемы. 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"
.
Улучшая бит на примере python412524, в документации указано, что это действительно так, и я нахожу его более чистым:
for form in br.forms():
if form.attrs['id'] == 'sblock':
br.form = form
break
Для любых будущих зрителей здесь другая версия, использующая аргумент 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
Попробуйте использовать: br.select_form(nr=0)
, где nr - номер формы (вам не нужно имя или идентификатор).
попробуйте:
[f.id for f in br.forms()]
Он должен вернуть список всех идентификаторов формы с вашей страницы
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
Вы можете использовать предикатный параметр функции 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")