我的目的是使用Mechanize向网站提交搜索查询,并使用BeautifulSoup分析结果。这将用于同一网站,因此表格名称等可以硬编码。我的初始查询出现问题,如下所示:
import mechanize import urllib2 #from bs4 import BeautifulSoup def inspect_page(url): br = mechanize.Browser(factory=mechanize.RobustFactory()) br.set_handle_robots(False) br.addheaders = [('User-agent', '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) try: br.open(url) except mechanize.HTTPError, e: print "HTTP Error", e.code, except urllib2.URLError as e: print "URL Error", e.reason, return for form in br.forms(): print form br.select_form(name="dataform") br.form['pcode'] = 'WV14 8EW' br.form['premise'] = '66' response = br.submit() print response.read() #soup = BeautifulSoup(response.read()) inspect_page('http://www.fensa.co.uk/asp/certificate.asp')
这没有重定向到结果页面,<img src="{{ site.url }}/public/img/{{ include.url }}" {% if page.layout == 'page' %}class="page"{% endif %}>
显示我提交查询的页面的HTML,所以我假设我的代码中出错了。但是,当我测试另一个网站(print response.read()
)并更改表单以匹配网站上的表单时:
inspect_page('https://publicaccess.glasgow.gov.uk/online-applications/search.do?action=simple')
我按照我的预期被重定向。有没有什么可以在调用`br.select_form(name="searchCriteriaForm")
br.form['searchCriteria.simpleSearchString'] = 'Queen Elizabeth Gardens'
response = br.submit()
print response.read()`
时阻止页面重定向?我已经检查过该网站没有GZipped。
答案 0 :(得分:2)
只有在通过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提供的提示
答案 1 :(得分:0)
一个限制是mechanize
不了解JavaScript。在脚本中提交站点上的搜索表单会触发JavaScript函数,该函数会在实际提交表单值之前验证输入并更改action
的{{1}}属性。
以下是表单的HTML部分:
<form>
这是在该HTML文档开头附近定义的<a onclick="return validate_required()" name="submit" href="#">
<input class="button" type="button" value="Search" name="Submit2">
</a>
函数:
validate_required()