【问题标题】:Mechanize br.submit() limitations?机械化 br.submit() 限制?
【发布时间】:2015-08-18 23:36:04
【问题描述】:

我的目的是使用 Mechanize 向网站提交搜索查询,并使用 BeautifulSoup 分析结果。这将用于同一个网站,因此可以对表单名称等进行硬编码。我的初始查询有问题,如下所示:

进口机械化 导入 urllib2 #从 bs4 导入 BeautifulSoup def 检查页面(网址): br = mechanize.Browser(工厂=mechanize.RobustFactory()) br.set_handle_robots(假) br.addheaders = [('用户代理', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6')] br.set_handle_redirect(mechanize.HTTPRedirectHandler) 尝试: br.open(url) 除了 mechanize.HTTPError,e: 打印“HTTP 错误”,e.code, 除了 urllib2.URLError 为 e: 打印“URL 错误”,e.reason, 返回 对于 br.forms() 中的表单: 打印表格 br.select_form(name="dataform") br.form['pcode'] = 'WV14 8EW' br.form['前提'] = '66' 响应 = br.submit() 打印 response.read() #soup = BeautifulSoup(response.read()) inspect_page('http://www.fensa.co.uk/asp/certificate.asp')

这没有重定向到结果页面,print response.read() 显示了我提交查询的页面的 HTML,所以我认为我的代码出错了。但是,当我测试另一个站点 (inspect_page('@987654321@')) 并更改表单以匹配站点上的表单时:

`br.select_form(name="searchCriteriaForm")
br.form['searchCriteria.simpleSearchString'] = 'Queen Elizabeth Gardens'
response = br.submit()
print response.read()`    

如我所料,我被重定向了。当调用br.submit() 时,有什么可以阻止页面重定向的吗?我已经检查过该网站不是 GZipped。

【问题讨论】:

    标签: python mechanize form-submit


    【解决方案1】:

    仅当通过 JavaScript 验证表单输入时,页面上的表单操作才会更改,因此我现在将字段直接提交到该 URL。

    `params = {'pcode': "WV14 8EW", 'premise': "66"}
    data = urllib.urlencode(params)
    request = mechanize.Request(certificate_results.asp)
    response = mechanize.urlopen(request, data=data)`

    感谢@BlackJack 的提示

    【讨论】:

      【解决方案2】:

      一个限制是mechanize 不了解 JavaScript。在您的脚本中提交网站上的搜索表单会触发一个 JavaScript 函数,该函数会在实际提交表单值之前验证输入并更改 <form>action 属性。

      这是表单的 HTML 部分:

      <a onclick="return validate_required()" name="submit" href="#">
        <input class="button" type="button" value="Search" name="Submit2">
      </a>
      

      这是在该 HTML 文档开头附近定义的 validate_required() 函数:

      function validate_required() {
      
          error = "";
          if (document.getElementById("pcode").value == '') { error = error + "Postcode\n"; }
          if (document.getElementById("premise").value == '') { error = error + "Premise\n"; }
      
          if (error != '') {
              alert("Please enter:\n\n" + error);
              return false;
          }
          else {
              document.dataform.action = "certificate_results.asp";
              document.dataform.submit();
      
          }
      }
      

      【讨论】:

      • 而不是通过 br.submit() 提交到当前 URL。我现在直接将参数发送到 javascript 中的 URL。 params = {'pcode': "WV14 8EW", 'premise': "66"} data = urllib.urlencode(params) request = mechanize.Request(redirect_url) response = mechanize.urlopen(request, data=data) 谢谢!
      猜你喜欢
      • 1970-01-01
      • 2012-03-03
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 2011-08-13
      相关资源
      最近更新 更多