导入ClientForm 来自urllib2 import urlopen
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)>>
因此,未找到name
,email
和url
输入。我该如何解决? TIA
更新:实际上,我没有单独使用ClientForm,但作为机械化的一部分,因此更喜欢一种允许修复而无需重写机械化代码的解决方案
答案 0 :(得分:1)
问题可能是HTML本身无效 - 例如,它反复使用id =“comment_form”,而每个文档只有一个给定名称的id。
你最好的解决方案可能是使用BeautifulSoup首先解析你的urlopen页面结果,然后将它打印回ClientForm的字符串 - 这可能会消除大部分粗糙的边缘并给ClientForm一个更好的机会做其事。
如果这不起作用,请获得结果的精美印刷,并找出您必须对HTML进行何种转换,以使表单对于ClientForm非常简单 - 通过删除无关标签和瑕疵
答案 1 :(得分: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']='kalmi@..com'