Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Remplir une page web et obtenir un résultat

0 votes

Noob total concernant l'utilisation de page web ici. Je cherche à remplir automatiquement un formulaire et obtenir les données générées par la suite. Vu que je ne m'y connais pas du tout, j'ai tenté un peu au hasard la lib mechanize pour faire ça. Le site en question est ici, si vous voulez tester vous pouvez mettre ces infos dans la box :

YHR021C
YBR143C
YDL067C
YMR194W

Du coup j'ai utilisé ce code :

from mechanize import Browser

br = Browser()
r = br.open("http://funspec.med.utoronto.ca/")
br.select_form(name="proteins")

Qui me donne une erreur :

mechanize._form.ParseError: unexpected '5' char in declaration

Une erreur similaire a été déjà discutée sur stackoverflow ici, et j'imagine que le problème vient de la page en question, mais je ne vois pas du tout comment résoudre la chose. Du coup plusieurs questions :

  • Peut être existe-t-il des méthodes/lib plus simples à utiliser pour faire ça
  • Sinon comment résoudre le problème ?
  • Aussi, je suis intéressé par des conseils pour parser le résultat obtenu quand ça marchera, je pense que c'est quelque chose qui pourrait être fait par des lib comme beautifulsoup, je me trompe ?
demandé 23-Mar-2016 par Jev (388 points)

ça va pas résoudre le problème mais peut-être faire avancer le Schmilblick:

Ton form s'appelle navscreation, c'est le textarea qui s'appelle proteins.

Normallement beautifulsoup a une fonction prettify pour cleaner le code mais ça marche pas:

from mechanize import Browser
from BeautifulSoup import BeautifulSoup

br = Browser()
response = br.open("http://funspec.med.utoronto.ca/")
soup = BeautifulSoup(response.get_data())
response.set_data(soup.prettify())
br.set_response(response)

br.select_form(name="navscreation")

Ceci dit tu peux essayer de faire du replace dans la réponse jusqu'à ce que ça marche :). Là je vois que le tag head est pas fermé entre autre. etc

Un truc genre:

soup = BeautifulSoup(response.get_data().replace('<HEAD>', '</HEAD></HEAD>'))

En mode bourrin quoi ^^

1 Réponse

+2 votes

Bon, finalement avec l'aide de max, j'ai réussi à faire fonctionner la chose (du moins sur mon python ça marche correctement) :

def launch_funspec(gene_list) :
    br = Browser()
    response = br.open("http://funspec.med.utoronto.ca/")
    soup = BeautifulSoup(response.get_data())
    response.set_data(soup.prettify())
    br.set_response(response)
​
    br.select_form(name="navscreation")
    br["proteins"] = "\r\n".join(gene_list)
    r = br.submit()
    return r.get_data()

​Même pas eu besoin de parser le html par la suite, ils proposent un fichier txt qui résume tout et que j'ai facilement pu parser avec deux regex et pandas.

répondu 23-Mar-2016 par Jev (388 points)
...