提交形式
问题描述:
我试图提交表单到http://apps.fas.usda.gov/esrquery/esrq.aspx在python,使用下面的代码:提交形式
import urllib
from bs4 import BeautifulSoup
import mechanize
import datetime
today = datetime.date.today().strftime("%m/%d/%Y")
url = 'http://apps.fas.usda.gov/esrquery/esrq.aspx'
html = urllib.urlopen(url).read()
soup = BeautifulSoup(html)
viewstate = soup.find('input', {'id' : '__VIEWSTATE'})['value']
eventval = soup.find('input', {'id' : '__EVENTVALIDATION'})['value']
br = mechanize.Browser(factory=mechanize.RobustFactory())
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
br.open(url)
# fill form
br.select_form("aspnetForm")
br.form.set_all_readonly(False)
br.form['__EVENTTARGET'] = ''
br.form['__EVENTARGUMENT'] = ''
br.form['__LASTFOCUS'] = ''
br.form['__VIEWSTATE'] = viewstate
br.form['__VIEWSTATEGENERATOR'] = '41AA5B91'
br.form['__EVENTVALIDATION'] = eventval
br.form['ctl00$MainContent$lbCommodity'] = ['401']
br.form['ctl00$MainContent$lbCountry'] = ['0:0']
br.form['ctl00$MainContent$ddlReportFormat'] = ['10']
br.find_control('ctl00$MainContent$cbxSumGrand').items[0].selected = True
br.find_control('ctl00$MainContent$cbxSumKnown').items[0].selected = False
br.form['ctl00$MainContent$rblOutputType'] = ['2']
br.form['ctl00$MainContent$tbStartDate'] = '01/01/1999'
br.form['ctl00$MainContent$ibtnStart'] = ''
br.form['ctl00$MainContent$tbEndDate'] = today
br.form['ctl00$MainContent$ibtnEnd'] = ''
br.form['ctl00$MainContent$rblColumnSelection'] = ['regular']
response = br.submit()
我得到的响应基本上是与形式的网站只是html代码按预期填写。然而,我期待一个Excel文件(因为我选择了OutputType值为2)
我想我在提交前面缺少一些东西。有人可以解释我缺少的东西吗?
答
您已经很近了,但您在提交后还需要做更多。在这种情况下,只需添加:
doc = response.read()
ofile = '<your path>'
with open(ofile, 'w') as f:
f.write(doc)
我不能真正在您的网站目前测试这一点,所以我只是假设你所有的设置,在此之前是正确的。我只有Python 3在工作,机械化仅适用于2.x.无论如何,这通常是您想要检索这种输出的方式。
当我这样做时,响应是将html(填写正确的表单)写入.xls文件(按照我的路径)。提交仍然出现问题。我注意到输出的日期图像是打开日期输入的。这是否会导致问题?有控制'ctl00 $ MainContent $ ibtnStart'和'ctl00 $ MainContent $ ibtnEnd',我留下了空白输入。这可能会导致问题吗? – rccommods
您是否可以在所有Jeff中添加更多帮助? – rccommods
它看起来像提交问题,但我不知道为什么。例如,如果你在'br.controls:print cont.name'中选择了表单,你会看到提交控件的名字,但是如果你试图传递'name = ...'提交,它说它没有看到它。另外,它写入文件的输出是主页面,而不是搜索结果,并且无论您设置了什么或没有设置在控件上,它都不会更改。即使您只是提交然后尝试阅读回复,您仍会看到它仍在开始页面上。可能需要做出这个不同的问题。 – Jeff