web-dev-qa-db-ja.com

IDを使用して選択フォームを機械化する

私はpythonで機械化に取り組んでいます。

<form action="/monthly-reports"  accept-charset="UTF-8" method="post" id="sblock">

ここのフォームには名前がありません。 idを使用してフォームを解析するにはどうすればよいですか?

22
sam

同じ問題の解決策としてこれを見つけました。 brは機械化オブジェクトです:

formcount=0
for frm in br.forms():  
  if str(frm.attrs["id"])=="sblock":
    break
  formcount=formcount+1
br.select_form(nr=formcount)

上記のループカウンターメソッドはよりPythonicで実行できると確信していますが、これはid="sblock"属性を持つフォームを選択する必要があります。

21
python412524

Python412524の例を少し改善して、ドキュメントにはこれも有効であると記載されており、少しわかりやすくなっています。

for form in br.forms():
    if form.attrs['id'] == 'sblock':
        br.form = form
        break
15
Dan

今後の視聴者向けに、predicate引数を使用した別のバージョンを示します。これは、必要に応じて、ラムダで1行にすることもできます。

def is_sblock_form(form):
    return "id" in form.attrs and form.attrs['id'] == "sblock"

br.select_form(predicate=is_sblock_form)

ソース: https://github.com/jjlee/mechanize/blob/master/mechanize/_mechanize.py#L462

7
Moshe

br.select_form(nr=0)を使用してみてください。nrはフォーム番号です(名前やIDは必要ありません)。

3
marbdq

試してください:

[f.id for f in br.forms()]

ページからすべてのフォームIDのリストを返す必要があります

1

Browserクラスの関数select_formの述語パラメーターを使用できます。このような:

from mechanize import Browser, FormNotFoundError

try:
   br.select_form(predicate=lambda frm: 'id' in frm.attrs and frm.attrs['id'] == 'sblock')
except FormNotFoundError:
  print("ERROR: Form not Found")   
0
roj4s
g_form_id = ""


def is_form_found(form1):
    return "id" in form1.attrs and form1.attrs['id'] == g_form_id


def select_form_with_id_using_br(br1, id1):
    global g_form_id
    g_form_id = id1
    try:
        br1.select_form(predicate=is_form_found)
    except mechanize.FormNotFoundError:
        print "form not found, id: " + g_form_id
        exit()


# ... goto the form page, using br = mechanize.Browser()

# now lets select a form with id "user-register-form", and print its contents
select_form_with_id_using_br(br, "user-register-form")
print br.form


# that's it, it works! upvote me if u like