4

Python で mechanize を使用してフォーム内のテキスト ボックス (複数のボックス) を自動入力しようとしていますが、ボックスの名前がハッシュであるため、 br.form['name'] のような入力を自動化できません。 = 'blah' 名前はハッシュ関数からの未知のハッシュであるため。これを行う方法はありますか?オンラインで調べましたが、何も見つかりませんでした。ありがとう!

4

3 に答える 3

1

これはうまくいくはずです。predicate明らかに、メソッドを更新する必要があります。また、フィールドに関する一定の情報はありますか? ID、クラス、ラベルなど?

import mechanize
import re

class MyBrowser:

    def __init__(self):
        self.user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)'
        self.cj = mechanize.LWPCookieJar()
        self.setup_browser(enable_debug=False)

    def find_by_crazy_name(self, control):
        if re.match('^[\w]{32,}$', control.name):
            return True
        return False

    def runit(self):
        self.agent.open('http://localhost')
        self.agent.select_form(name="foo")
        field = self.agent.form.find_control(predicate=self.find_by_crazy_name)
        field._value = "POOP"
        response = self.agent.submit()

    def enable_debug(self):
        self.agent.set_debug_http(True)
        self.agent.set_debug_redirects(True)
        self.agent.set_debug_responses(True)

    def setup_browser(self, enable_debug=False):
        self.agent = mechanize.Browser()
        self.agent.set_handle_redirect(True)
        self.agent.set_cookiejar(self.cj)
        self.agent.set_handle_referer(True)
        self.agent.set_handle_refresh(True)
        self.agent.set_handle_equiv(True)
        self.agent.set_handle_robots(False)
        self.enable_debug()
        self.agent.addheaders = [('User-Agent', self.user_agent)]


if __name__ == "__main__":
    browser = MyBrowser()
    browser.runit()

これは、すべての潜在的なフィールドに「POOP」を入力するだけです。32 文字の英数字 (md5 など) の場合、フィールドは一致します。

于 2012-12-07T19:17:26.217 に答える
0

がディクショナリであると仮定するbr.formと、キーを繰り返し処理して、フォーム内のすべてのフィールドのデフォルトを設定できます。

for key in br.form:
    br.form[key] = 'blah'

不明なフィールドのデフォルトのみを入力したい場合は、他のすべてのフィールド名を知っていると想定しているので、次のようにすることができます。

known_fields = set(['foo', 'bar'])  # put your known keys in here
for key in br.form:
    if key not in known_fields:
        # this must be the hash
        br.form[key] = 'blah'

br.formこれは、おそらくNoneまたは空の文字列値を持つ、ハッシュ フィールドが既に に存在することを前提としていることに注意してください。私は機械化を使用したことがないので、これが当てはまるかどうかはわかりません。

于 2012-12-07T18:19:54.523 に答える
0

要求されたフォームに常に同じ数のフォームがある場合は、フォーム番号で見つけることができます (0 は最初のフォームなど)。

試すbr.select_form(nr=number)

于 2012-12-07T18:47:13.153 に答える