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 回答