2010-11-24 46 views
3

je ne sers Mechanize pour un jour, donc agréable: PComment télécharger un fichier, en utilisant Python Mechanize, avec une touche :) Ok

Je voudrais remplir un formulaire dont un (ou deux si possible) les champs de style de téléchargement de fichier. Ceux sur lesquels vous cliquez et qui vous permettent de rechercher un fichier.

(je veux automatiser le téléchargement d'un .torrent à un tracker/site privé)

Maintenant, les deux questions que j'ai eu est sur le site aucune des formes ont des noms, donc j'utilise la index du formulaire pour les choisir.

br.select_form(nr=4) 

Maintenant, le problème est que je veux également télécharger un fichier lorsque je soumets le formulaire. Il y a deux champs de fichier et je ne pense pas que je spécifie correctement chacun d'eux. Voici une « impression » du formulaire fait en utilisant « print br.form »

<POST http://www.###.##.##/takeupload.php multipart/form-data 
    <HiddenControl(MAX_FILE_SIZE=1000000) (readonly)> 
    <TextControl(<None>=http://www.###.##.##:81/announce.php?passkey=###) (readonly)> 
    <FileControl(file=<No files added>)> 
    <TextControl(name=)> 
    <SelectControl(type=[*0, 23, 22, 1, 10, 7, 12, 4, 21, 17, 18, 13, 58, 16, 15, 56, 20, 60, 5, 19, 6, 55, 57, 63, 9])> 
    <CheckboxControl(strip=[strip])> 
    <FileControl(nfo=<No files added>)> 
    <TextareaControl(descr=)> 
    <SubmitControl(<None>=Do it!) (readonly)>> 

J'ai essayé ce code en espérant qu'il serait juste par défaut à la première:

br.form.add_file(open(filename), 'text/plain', filename) 

Mais, il donne à cette erreur

Traceback (most recent call last): 
    File "script.py", line 53, in <module> 
    br.form.add_file(open(filename), 'text/plain', filename) 
    File "/usr/local/lib/python2.6/dist-packages/mechanize-0.2.4-py2.6.egg/mechanize/_form.py", line 2968, in add_file 
    self.find_control(name, "file", id=id, label=label, nr=nr).add_file(
    File "/usr/local/lib/python2.6/dist-packages/mechanize-0.2.4-py2.6.egg/mechanize/_form.py", line 3101, in find_control 
    return self._find_control(name, type, kind, id, label, predicate, nr) 
    File "/usr/local/lib/python2.6/dist-packages/mechanize-0.2.4-py2.6.egg/mechanize/_form.py", line 3183, in _find_control 
    raise AmbiguityError("more than one control matching "+description) 
mechanize._form.AmbiguityError: more than one control matching type 'file' 

Alors, comment dois-je:

  • tell ce qui champ fichier que je voulais dire
  • ou télécharger le fichier d'une autre façon

Merci beaucoup :)

Répondre

9

Communauté: S'il vous plaît fixer, je suis un simple passant qui a rencontré cette erreur et a résolu .

br.form.add_file(open(filename), 'text/plain', filename, **kwargs) 

Vous devez résoudre l'ambiguïté en passant dans un argument mot-clé supplémentaire pour identifier le contrôle spécifique que vous souhaitez ajouter le fichier. Vous pouvez ajouter un nom, un identifiant, un numéro ou un libellé.

Dans ce cas, il serait

br.form.add_file(open(filename), 'text/plain', filename, name='file')