0

从 urllib2 导入 ClientForm 导入 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输入。我该如何解决?TIAemailurl

更新:实际上,我没有单独使用 ClientForm,而是作为机械化的一部分,因此更喜欢允许在不重写机械化代码的情况下进行修复的解决方案

4

2 回答 2

1

问题很可能是 HTML 本身无效 - 例如,它一遍又一遍地重复使用 id="comment_form",而每个文档只应该有一个给定名称的 id。

您最好的解决方案可能是首先使用 BeautifulSoup 解析您的 urlopen 页面结果,然后将其漂亮地打印回 ClientForm 的字符串 - 这可能会消除大多数粗糙的边缘并给 ClientForm 一个更好的机会做它事物。

如果这不起作用,请打印出漂亮的结果并计算出您必须对 HTML 进行什么样的转换,以使 ClientForm 的表单非常简单——通过删除无关的标签和杂物。

于 2009-11-06T00:56:50.277 回答
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'
于 2009-11-06T09:31:12.080 回答