python
  • forms
  • submit
  • mechanize
  • submission
  • 2016-07-29 10 views 0 likes 
    0

    に機械化使用してフォームを送信:私は次のコードを使用して、Pythonで<a href="http://apps.fas.usda.gov/esrquery/esrq.aspx" rel="nofollow">http://apps.fas.usda.gov/esrquery/esrq.aspx</a>にフォームを送信しようとしていますの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

    ジェフのすべてのサポートを追加できますか? – rccommods

    +0

    問題は提出であるように見えますが、私はなぜそれがわかりません。たとえば、 'cont in br.controls:print cont.name'を実行すると、フォームを選択した後、そこにサブミットコントロールの名前が表示されますが、' name = ... 'を渡そうとすると、提出すると、それはそれを見ていないと言います。また、ファイルに書き出す出力は検索結果ではなくメインページで、設定した内容やコントロールに設定されていない内容は変更されません。応答を送信してから試してみても、開始ページに表示されます。これは別の質問にする必要があります。 – Jeff

    関連する問題

     関連する問題