• # MechanicalSoup

    Posté par . En réponse au message Question de newbie sur la soumission de formulaire avec python-request. Évalué à 3.

    Voici une solution avec MechanicalSoup, une surcouche à requests et BeautifulSoup (un analyseur de HTML) :

    import re
    from mechanicalsoup import StatefulBrowser
    browser = StatefulBrowser()
    browser.open('https://www.e-chargement.com/orsayuniversite/restau/')
    browser.select_form()
    browser['badge_number'] = '12345'
    browser['badge_nom'] = 'Nom Prénom'
    browser.submit_selected()
    for td in browser.page.find_all('td'):
     if td.find(string=re.compile('Solde')):
     break
    print(td.find_next_sibling().string)

    Les variables browser.page et td sont des objets BeautifulSoup. Il faut lire un peu la doc pour comprendre comment ils marchent.

    MechanicalSoup automatise quelques opérations qu'on pourrait réaliser manuellement avec requests. L'idée est d'aller sur la page https://www.e-chargement.com/orsayuniversite/restau/, puis de poster le formulaire, et exploiter la page obtenue.

    Avec requests, ça donnerait un truc du genre :

    session = requests.Session()
    session.get('https://www.e-chargement.com/orsayuniversite/restau/')

    pour initialiser la session. Puis il faut poster le formulaire :

    reponse = session.post('https://www.e-chargement.com/identif_badge.Asp', data={
     'badge_number': '12345', 'badge_nom': 'Nom Prénom', 'badge_div': '1234'
    })

    La valeur de badge_div est celle d'un <input type="hidden"> du formulaire, à récupérer avec BeautifulSoup. Après il reste à exploiter reponse.text.

    Les sessions requests se chargent de gérer les redirections et les cookies.