2011-10-06 11 views
10

Makineyle birlikte bir form seçmek istiyorum. Bu benim kodudur:Python Mechanize formunu seç FormNotFoundError

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

formun kod:

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

Ama bu hata alıyorum:

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

cevap

23

Sorun formu adı yok yani, sadece bir kimlik ve login_form.

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

(eğer öyleyse f.attrs, anahtar id vardır ve eğer se nerede, id değeri login_form eşittir): Bir yüklemi kullanabilirsiniz. Eğer birincisi Örneğin ikincisi vs. olup olmadığını bilmek eğer Alternatif olarak, sayfanın formun sayısını geçebilir, çizgi aşağıdaki ilk formu seçer:

br.select_form(nr=0) 
1

biraz daha okunabilir: o

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

neden gibi 'def element_by_id (id) ve bir işlev: f.attrs ve f.attrs [ 'id] dönüş 'kimlik' ==' login_form''? – brandizzi

+1

Aklımda C++ functor vardı. Ama "f" nesnesini nasıl işleve geçirirsin? (yüklem formları alır, kimlikler değil, doğru mu?). Ve ben bu tür select_form'ların çoğunu, ancak her defasında farklı form-kimliğiyle (her form kimliği için yeni bir işlev yapmak istemiyorum) verebileceğim bir şey istedim. – nivniv