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 코드를 예상대로 채 웁니다. 그러나, 나는 엑셀 파일을 기대하고 있었다. (OutputType 값을 2로 선택했기 때문에)

제출 앞면에 뭔가 빠져 있다고 생각한다. 누군가 내가 놓친 것에 대해 밝힐 수 있습니까?

답변

0

닫기 만 완료했지만 제출 한 후에 더해야합니다. 실제로 순간에 당신의 웹 사이트에이를 테스트 할 수

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

, 그래서 이것은 올바른 전에 난 그냥 모든 설정을 있으리라 믿고있어이 경우 바로 추가 할 수 있습니다. 파이썬 3 만 사용하고 기계화는 2.x에서만 작동합니다. 그럼에도 불구하고 일반적으로 이러한 유형의 출력을 검색하는 방법입니다.

+0

이렇게하면 응답은 .xls 파일 (내 경로대로)에 html (양식이 올바르게 채워져 있음)을 쓰고 있습니다. 제출과 관련하여 여전히 문제가있는 것으로 보입니다. 내가 알아 차 렸던 것은 출력물에 날짜 입력을위한 달력 이미지가 열려 있다는 것입니다. 이것이 문제의 원인이 될 수 있습니까? 빈 입력으로 남긴 'ctl00 $ MainContent $ ibtnStart'및 'ctl00 $ MainContent $ ibtnEnd'컨트롤이 있습니다. 그것이 잠재적으로 문제를 일으킬 수 있습니까? – rccommods

+0

제프에서 더 이상 도움을받을 수 있습니까? – rccommods

+0

제출하는 데 문제가있는 것 같지만 이유는 확실하지 않습니다. 예를 들어, 'for cont br.controls : print cont.name'을 수행하면 폼을 선택한 후에 submit 컨트롤의 이름을 볼 수 있지만'name = ...' 제출하면, 그것을 보지 못한다고합니다. 또한 파일에 기록하는 출력은 검색 결과가 아닌 기본 페이지이며 설정 한 내용이나 컨트롤에 설정하지 않은 내용은 변경되지 않습니다. 응답을 제출하고 읽으려고해도 시작 페이지에 계속 표시됩니다. 이 질문을 다른 질문으로 만들어야 할 수도 있습니다. – Jeff