我正在尝试使用python中的mechanize自动填充表单中的文本框(多个框),但是框的名称是一个哈希,所以我不能像br.form那样自动化输入[' name'] ='blah',因为名称是哈希函数的未知哈希。有没有办法做到这一点?我在网上看过,但一直找不到任何东西。谢谢!
答案 0 :(得分:1)
这对你有用。显然,您需要更新predicate
方法。另外,您有关于该领域的任何持续信息吗? id,class,label等?
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)
,则字段匹配答案 1 :(得分: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
或空字符串值。我没有使用机械化,所以我不确定是否是这种情况。
答案 2 :(得分:0)
如果所要求的表格总是具有相同数量的表格,您可以通过表格编号找到它(0表示第一个表格,等等)
尝试br.select_form(nr=number)