Python ClientForm 错误

0 投票
2 回答
582 浏览
提问于 2025-04-15 15:41

首先,我们导入了一个叫做ClientForm的库,还有一个从urllib2库中获取网页内容的功能。

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这些输入框。我该怎么解决这个问题呢?谢谢!

更新:实际上,我并不是单独使用ClientForm,而是把它当作mechanize的一部分来用,所以我希望能找到一个解决方案,能在不重写mechanize代码的情况下修复这个问题。

2 个回答

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'
1

这个问题很可能是因为HTML本身有问题,比如它重复使用了id="comment_form"这个标识,而在一个文档中,每个标识应该是唯一的,只能出现一次。

最好的解决办法可能是先用BeautifulSoup来解析你通过urlopen获取的页面内容,然后再把它整理成一个字符串,这样可以让ClientForm更好地处理这些内容。

如果这样还是不行,那就把结果整理出来,看看需要对HTML做什么样的修改,才能让表单变得简单易懂,主要是去掉多余的标签和杂乱的内容。

撰写回答