4

mechanize for python を使用してフォームを送信しようとしていますが、入力する必要があるフォーム コントロールに名前が割り当てられていません。

<POST https://sample.com/anExample multipart/form-data
  <HiddenControl(post_authenticity_token=) (readonly)>
  <HiddenControl(iframe_callback=) (readonly)>
  <TextareaControl(<None>=)>>

編集しようとしているコントロールは、上記のオブジェクトの最後のコントロール<TextareaControl(<None>=)>です。

私はドキュメントを見てきましたが、そのコントロールには名前が関連付けられていないため、そのコントロールに値を割り当てる方法が見つからないようです。

  forms = [f for f in br.forms()]
  print forms[2].controls[5].name

「なし」を出力

4

1 に答える 1

6

だから、私はあなたに認めます、これは理解するのがかなり大変でした. 文字通り、mechanizeコード自体を見て理解する必要がありました。残念ながら、name属性のない実際のフォーム アイテムで確実にテストすることはできませんでしたが、プルしようとしているサイトを提供するか、自分で行うことができます。

フォーム オブジェクトは、正直なところ、使いやすさの点であまりうまく実装されていません。名前のないフォーム コントロールの値を編集する唯一の方法は、フォームset_valueメソッドを使用することです。

class HTMLForm:

    # <...>

    set_value(value,
          name=None, type=None, kind=None, id=None, nr=None,
          by_label=False,  # by_label is deprecated
          label=None)

したがって、探しているコントロールを設定するためにここで行うことはnr、フォーム内のコントロールのインデックスを使用して、引数を使用してそれを取得することです。残念ながら、負の整数を使用して後ろからコントロールを取得することはできないため、最後のフォームを取得するには、 の行に沿って何かを行う必要がありnr=len(myform.controls)-1ます。

いずれにせよ、ここでできることはそのset_valueメソッドを使用することであり、次のように設定する必要があります。

forms[2].set_value("LOOK!!!! I SET THE VALUE OF THIS UNNAMED CONTROL!", 
                       nr=5)

それはあなたのために働くはずです。それがどうなるか教えてください。

于 2012-12-23T06:14:35.057 に答える