2016-07-29 33 views
0

Ich versuche, eine Form zu http://apps.fas.usda.gov/esrquery/esrq.aspx in Python zu unterbreiten, mit dem folgenden Code:einreicht Form in Python mit mechanisieren

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() 

Die Antwort, die ich bekommen habe ist, im Wesentlichen nur der HTML-Code der Seite mit dem Formular ausgefüllt wie erwartet. Allerdings habe ich eine Excel-Datei erwartet (da ich OutputType Wert von 2 gewählt habe)

Ich denke, ich vermisse etwas auf der Einreichung Front. Könnte jemand etwas beleuchten, was ich vermisse?

Antwort

0

Sie sind in der Nähe, aber nach dem Absenden müssen Sie noch mehr tun. In diesem Fall fügen Sie einfach:

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

ich das nicht wirklich auf Ihrer Website im Moment testen konnte, so gehe davon aus ich nur alle Einstellungen, bevor diese richtig sind. Ich habe nur Python 3 bei der Arbeit, und Mechanisieren funktioniert nur auf 2.x. Unabhängig davon ist dies normalerweise die Art, wie Sie diese Art von Ausgabe abrufen möchten.

+0

Wenn ich dies tue, schreibt die Antwort den HTML-Code (mit korrekt ausgefülltem Formular) in eine .xls-Datei (gemäß meinem Pfad). Mit dem submit scheint immer noch etwas nicht in Ordnung zu sein. Was ich bemerkt habe ist, dass die Ausgabe das Kalenderbild für den Datumseingang geöffnet hat. Könnte das das Problem verursachen? Es gibt die Steuerelemente 'ctl00 $ MainContent $ ibtnStart' und 'ctl00 $ MainContent $ ibtnEnd', die ich mit leeren Eingaben verlassen habe. Könnte das möglicherweise das Problem verursachen? – rccommods

+0

Können Sie noch mehr Hilfe bei Jeff hinzufügen? – rccommods

+0

Es sieht aus wie das Problem mit submit ist, aber ich bin mir nicht sicher warum. Zum Beispiel, nachdem Sie das Formular gewählt haben, wenn Sie 'für cont in br.controls: print cont.name' tun, sehen Sie den Namen des Übermittlungssteuerelements dort, aber wenn Sie versuchen,' name = ... 'zu übergeben in submit, es sagt, es sieht es nicht. Außerdem ist die Ausgabe, die in die Datei geschrieben wird, die Hauptseite, nicht die Suchergebnisse, und sie ändert sich nicht, egal was Sie festlegen oder nicht auf den Steuerelementen festlegen. Selbst wenn Sie nur die Antwort einreichen und dann versuchen, die Antwort zu lesen, sehen Sie, dass sie noch auf der Startseite ist. Vielleicht muss dies eine andere Frage stellen. – Jeff