2011-10-06 810 views
10

我想選擇一個機械化的窗體。這是我的代碼:Python機械化選擇窗體FormNotFoundError

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 

回答

23

的問題是,你的表格沒有一個名字,只有一個ID,它是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

多一點可讀:

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

爲什麼如'DEF element_by_id(ID)而不是一個函數:在f.attrs和f.attrs [ 'ID']返回 'ID' ==' login_form''? – brandizzi

+1

我的腦海裏有C++函子。但是,如何將「f」對象傳遞給你的函數呢? (謂詞獲取表單,而不是id,對嗎?)。 我想要的東西,我可以給很多這樣的select_form的謂詞,但每次都有不同的表單id(我不想爲每個表單id做一個新的函數) – nivniv