2016-07-29 9 views
0

Я пытаюсь представить форму http://apps.fas.usda.gov/esrquery/esrq.aspx в питоне, используя следующий код:формы Подающей с помощью механизировать в питоне

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

Можете ли вы добавить любую помощь вообще Джеффу? – rccommods

+0

Похоже, проблема связана с отправкой, но я не уверен, почему. Например, после того, как вы выберете форму, если вы выполняете 'for cont в br.controls: print cont.name', вы увидите там имя элемента управления отправкой, но если вы попытаетесь передать' name = ... ' в submit, он говорит, что не видит этого. Кроме того, вывод, который он записывает в файл, является главной страницей, а не результатами поиска, и она не изменяется независимо от того, что вы устанавливаете или не устанавливаете на элементы управления. Даже если вы просто отправляете и затем пытаетесь прочитать ответ, вы увидите, что он находится на стартовой странице. Возможно, это будет другой вопрос. – Jeff