机械化 br.submit() 限制?
Mechanize br.submit() limitations?
我的目的是使用 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')
这并没有重定向到结果页面,print response.read()
显示了我提交查询的页面的 HTML,所以我假设我的代码出错了。但是,当我测试另一个站点 (inspect_page('<a href="https://publicaccess.glasgow.gov.uk/online-applications/search.do?action=simple" rel="nofollow">https://publicaccess.glasgow.gov.uk/online-applications/search.do?action=simple</a>')
) 并更改表单以匹配站点上的表单时:
`br.select_form(name="searchCriteriaForm")
br.form['searchCriteria.simpleSearchString'] = 'Queen Elizabeth Gardens'
response = br.submit()
print response.read()`
如我所料,我被重定向了。当 br.submit()
被调用时,有什么可以阻止页面被重定向吗?我已经检查过该站点未使用 GZip 压缩。
一个限制是 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();
}
}
仅当通过 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 的提示
我的目的是使用 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')
这并没有重定向到结果页面,print response.read()
显示了我提交查询的页面的 HTML,所以我假设我的代码出错了。但是,当我测试另一个站点 (inspect_page('<a href="https://publicaccess.glasgow.gov.uk/online-applications/search.do?action=simple" rel="nofollow">https://publicaccess.glasgow.gov.uk/online-applications/search.do?action=simple</a>')
) 并更改表单以匹配站点上的表单时:
`br.select_form(name="searchCriteriaForm")
br.form['searchCriteria.simpleSearchString'] = 'Queen Elizabeth Gardens'
response = br.submit()
print response.read()`
如我所料,我被重定向了。当 br.submit()
被调用时,有什么可以阻止页面被重定向吗?我已经检查过该站点未使用 GZip 压缩。
一个限制是 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();
}
}
仅当通过 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 的提示