2011-10-06 17 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

समस्या यह है कि आपके प्रपत्र एक नाम नहीं है, केवल एक आईडी, और यह login_form है।

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

(तुम कहाँ se अगर 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

क्यों इस तरह के 'डीईएफ़ element_by_id (आईडी) के रूप में एक समारोह नहीं: f.attrs और f.attrs [ 'आईडी'] में वापसी 'आईडी' == ' login_form''? – brandizzi

+1

मेरे दिमाग में सी ++ मज़ेदार था। लेकिन फिर आप अपने कार्य में "एफ" ऑब्जेक्ट को कैसे पास करेंगे? (predicate फॉर्म हो जाता है, आईडी नहीं, सही?)। और मैं कुछ ऐसा चाहता था जो मैं भविष्य में कई ऐसे चयन_फॉर्म को दे सकता हूं, लेकिन हर बार अलग-अलग फॉर्म-आईडी के साथ (मैं प्रत्येक फॉर्म-आईडी के लिए एक नया फ़ंक्शन नहीं बनाना चाहता) – nivniv

संबंधित मुद्दे