【问题标题】:Python Mechanize select form FormNotFoundErrorPython Mechanize 选择表单 FormNotFoundError
【发布时间】:2011-12-02 04:48:43
【问题描述】:

我想选择一个带有机械化的表格。这是我的代码:

br = mechanize.Browser()
self.br.open(url)
br.select_form(name="login_form")

表格代码:

<form id="login_form" onsubmit="return Index.login_submit();" method="post" action="index.php?action=login&server_list=1">

但我收到此错误:

mechanize._mechanize.FormNotFoundError: no form matching name 'login_form

【问题讨论】:

    标签: python mechanize mechanize-python


    【解决方案1】:

    问题是你的表单没有名字,只有一个id,它是login_form。您可以使用谓词:

    br.select_form(predicate=lambda f: f.attrs.get('id', None) == 'login_form')
    

    (如果f.attrs 具有键id 并且如果是,则id 值等于login_form)。或者,您可以传递页面中表单的编号,如果您知道它是第一个,第二个等。例如,下面的行选择第一个表单:

    br.select_form(nr=0)
    

    【讨论】:

      【解决方案2】:

      更具可读性:

      class Element_by_id:
          def __init__(self, id_text):
              self.id_text = id_text
          def __call__(self, f, *args, **kwargs):
              return 'id' in f.attrs and f.attrs['id'] ==self.id_text
      

      然后:

      b.select_form(predicate=Element_by_id("login_form"))
      

      【讨论】:

      • 为什么不用def element_by_id(id): return 'id' in f.attrs and f.attrs['id'] == 'login_form'这样的函数?
      • 我脑子里有 C++ 仿函数。但是你如何将“f”对象传递给你的函数呢? (谓词获取形式,而不是 id,对吗?)。我想要一些我可以用谓词给许多这样的 select_form 的东西,但每次都有不同的 form-id(我不想为每个 form-id 创建一个新函数)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2017-03-07
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      相关资源
      最近更新 更多