2016-07-29 173 views
0

我試圖提交表單到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)

我想我在提交前面缺少一些東西。有人可以解釋我缺少的東西嗎?

回答

0

您已經很近了,但您在提交後還需要做更多。在這種情況下,只需添加:

doc = response.read() 
ofile = '<your path>' 
with open(ofile, 'w') as f: 
    f.write(doc) 

我不能真正在您的網站目前測試這一點,所以我只是假設你所有的設置,在此之前是正確的。我只有Python 3在工作,機械化僅適用於2.x.無論如何,這通常是您想要檢索這種輸出的方式。

+0

當我這樣做時,響應是將html(填寫正確的表單)寫入.xls文件(按照我的路徑)。提交仍然出現問題。我注意到輸出的日期圖像是打開日期輸入的。這是否會導致問題?有控制'ctl00 $ MainContent $ ibtnStart'和'ctl00 $ MainContent $ ibtnEnd',我留下了空白輸入。這可能會導致問題嗎? – rccommods

+0

您是否可以在所有Jeff中添加更多幫助? – rccommods

+0

它看起來像提交問題,但我不知道爲什麼。例如,如果你在'br.controls:print cont.name'中選擇了表單,你會看到提交控件的名字,但是如果你試圖傳遞'name = ...'提交,它說它沒有看到它。另外,它寫入文件的輸出是主頁面,而不是搜索結果,並且無論您設置了什麼或沒有設置在控件上,它都不會更改。即使您只是提交然後嘗試閱讀回覆,您仍會看到它仍在開始頁面上。可能需要做出這個不同的問題。 – Jeff