2009-11-05 17 views
0

進口ClientForm 從urllib2的進口的urlopenPython的ClientForm錯誤

page = urlopen('http://garciainteractive.com/blog/topic_view/topics/content/') 
form = ClientForm.ParseResponse(page, backwards_compat=False) 
print form[0] 

的問題是,ClientForm解析第一個HTML表單的方式如下:

<POST http://garciainteractive.com/blog/topic_view/topics/content/ application/x-www-form-urlencoded 
    <HiddenControl(ACT=1) (readonly)> 
    <HiddenControl(RET=http://garciainteractive.com/blog/topic_view/topics/content/) (readonly)> 
    <HiddenControl(URI=/blog/topic_view/topics/content/) (readonly)> 
    <HiddenControl(PRV=) (readonly)> 
    <HiddenControl(XID=d840927d4eaf95cef7aeca789009fb3991f574da) (readonly)> 
    <HiddenControl(entry_id=42) (readonly)> 
    <HiddenControl(site_id=1) (readonly)> 
    <CheckboxControl(save_info=[yes])> 
    <CheckboxControl(notify_me=[yes])> 
    <TextControl(captcha=)> 
    <SubmitControl(submit=Submit) (readonly)>> 

因此,沒有找到nameemailurl投入。我該如何解決它? TIA

更新:其實,我沒有使用ClientForm分開,而是作爲機械化的一部分,因此寧願一個解決方案,允許無需重寫代碼機械化

回答

1

的問題很可能是HTML本身是無效的修復 - 例如,它一遍又一遍地重複使用id =「comment_form」,而每個文檔只能有一個給定名稱的id。

您的最佳解決方案可能是使用BeautifulSoup首先解析您的urlopen頁面結果,然後再將它打印回ClientForm的字符串中 - 這可能會消除大部分粗糙的邊緣並給ClientForm更好做它的事情的機會。

如果這不起作用,請將結果打印出來,然後弄清楚爲了使ClientForm的表單非常簡單,您必須對HTML進行什麼樣的轉換 - 通過刪除無關的標籤和殘餘。

+0

感謝您的有用答案,請檢查我發佈到原始問題的更新 – Fluffy 2009-11-06 09:18:49

1

由於理查德建議使用BeautifulSoup。

from BeautifulSoup import BeautifulSoup, SoupStrainer 
from StringIO import StringIO 
from urllib2 import urlopen 
import ClientForm 

url='http://garciainteractive.com/blog/topic_view/topics/content/'   

html=urlopen(url).read() 
forms_filter=SoupStrainer('form',id="comment_form") 
soup = BeautifulSoup(html,parseOnlyThese=forms_filter) 
forms = ClientForm.ParseFile(StringIO(soup),"", backwards_compat=False) 
forms[0]['name']='Kalmi' 
forms[0]['email']='[email protected]'