2011-10-06 5 views
10

기계화 된 양식을 선택하고 싶습니다. 이건 내 코드입니다 :파이썬 기계어 선택 양식 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을 가지고 있으며, 경우 SE는 경우, 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과 같이 predicate를 사용할 수있는 것을 원했지만 매번 다른 form-id를 사용했습니다 (각 form-id에 대해 새로운 함수를 만들고 싶지는 않습니다) – nivniv