Python Mechanize выберите форму FormNotFoundError - PullRequest
10 голосов
/ 06 октября 2011

Я хочу выбрать форму с помощью механизации. Это мой код:

br = mechanize.Browser()
self.br.open(url)
br.select_form(name="login_form")

Код формы:

<form id="login_form" onsubmit="return Index.login_submit();" method="post" action="index.php?action=login&server_list=1">

Но я получаю эту ошибку:

mechanize._mechanize.FormNotFoundError: no form matching name 'login_form

Ответы [ 2 ]

23 голосов
/ 06 октября 2011

Проблема в том, что ваша форма не имеет имени, только идентификатор, и это login_form.Вы можете использовать предикат:

br.select_form(predicate=lambda f: f.attrs.get('id', None) == 'login_form')

(где вы указываете, если f.attrs имеет ключ id и, если это так, значение id равно login_form).Кроме того, вы можете передать номер формы на странице, если вы знаете, является ли она первой, второй и т. Д. Например, строка ниже выбирает первую форму:

br.select_form(nr=0)
1 голос
/ 23 февраля 2013

чуть более читабельно:

class Element_by_id:
    def __init__(self, id_text):
        self.id_text = id_text
    def __call__(self, f, *args, **kwargs):
        return 'id' in f.attrs and f.attrs['id'] ==self.id_text

тогда:

b.select_form(predicate=Element_by_id("login_form"))
...