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したがって、 、emailおよびurl入力が見つかりません。どうすれば修正できますか?ティア

更新: 実際には、私は ClientForm を個別に使用していませんが、機械化の一部として使用しているため、機械化コードを書き直さずに修正できるソリューションを好むでしょう

4

2 に答える 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'
于 2009-11-06T09:31:12.080 に答える
1

問題は、HTML 自体が無効である可能性があります。たとえば、ドキュメントごとに特定の名前の ID が 1 つしかないはずなのに、id="comment_form" を何度も再利用しています。

あなたの最善の解決策は、まず BeautifulSoup を使用して urlopen ページの結果を解析し、次にそれを ClientForm の文字列にきれいに出力することです。もの。

これがうまくいかない場合は、結果のプリティ プリントを取得し、HTML でどのような変換を行う必要があるかを調べて、ClientForm のフォームを非常にシンプルにします。

于 2009-11-06T00:56:50.277 に答える