2009-05-07 7 views
2

Fond:Soumission de formulaire en Python sans attribut de nom

En utilisant urllib et urllib2 en Python, vous pouvez effectuer une soumission de formulaire.

Vous créez d'abord un dictionnaire. Ensuite, vous utilisez la méthode urlencode d'urllib pour transformer ce dictionnaire.

params = urllib.urlencode(formdictionary) 

Vous pouvez maintenant faire une demande d'URL avec urllib2 et passer les params variables comme paramètre secondaire avec le premier paramètre étant l'URL. D'après ce que je comprends, urlencode code automatiquement le dictionnaire en html et ajoute la balise d'entrée. Il prend la clé pour être l'attribut de nom. Il faut que la valeur du dictionnaire soit la valeur de l'attribut name. Urllib2 envoie ce code html via une requête HTTP POST.

Problème:

Ceci est bien si le code HTML que vous soumettez à est formaté de manière standard avec l'entrée de balise html ayant l'attribut name.

<input id="32324" type="text" name="search" > 

Mais, il y a le cas où le code html n'est pas correctement formaté. Et la balise d'entrée html n'a qu'un attribut id sans attribut de nom. Y a-t-il un autre moyen d'accéder à la balise d'entrée via l'attribut id? Ou est-il peut-être encore un autre moyen?

Solution:

?

Répondre

2

Selon the W3 standard, pour qu'un champ de saisie soit soumis, il doit avoir un attribut de nom. Un test rapide sur Firefox 3 et Safari 3.2 montre qu'un champ de saisie qui manque l'attribut name mais qui a un attribut id n'est pas soumis. Cela dit, si vous avez un formulaire que vous souhaitez soumettre et que certains de ses champs ont un identifiant mais pas un nom, l'utilisation de l'attribut id semble être la seule option disponible. Il se peut que d'autres navigateurs utilisent l'attribut id, ou peut-être que du code JavaScript gère l'événement de soumission au lieu de laisser le navigateur le faire.

+0

Je pense qu'Ayman peut être sur quelque chose. Le formulaire d'entrée peut être une mauvaise direction. Le Javascript gère l'événement de soumission onclick. Je n'ai aucune idée de comment faire cet événement en python. Je vais essayer d'en savoir plus sur ce sujet. –

+0

@Ayman: Merci d'avoir testé cela - j'avais tort, et j'ai supprimé ma réponse trompeuse. – RichieHindle

+3

Un moyen facile d'émuler le code JavaScript est d'inspecter les en-têtes HTTP pour voir ce qui est envoyé par le navigateur, puis d'envoyer la même requête en utilisant urllib. L'extension Live HTTP Headers pour Firefox est utile à cet égard. https://addons.mozilla.org/en-US/firefox/addon/3829 –

0

Une étiquette d'entrée sans nom ne sera pas soumise en tant que paramètre de formulaire.

Par exemple, créer une page HTML contenant ceci:

<form> 
    <input type="text" name="one" value="foo"/> 
    <input type="text" value="bar"/> 
    <input type="submit"/> 
</form> 

Vous pouvez voir que le deuxième champ de texte manque un attribut name. Si vous cliquez sur « envoyer », la page sera actualisée avec la chaîne de requête:

test.html?one=foo 

Une bonne stratégie pour cela serait de regarder une demande en direct POST envoyé par votre navigateur et en émulant que. Utilisez un outil comme l'extension FireBug pour Firefox pour voir la requête POST et les paramètres envoyés par votre navigateur. Il y a peut-être des paramètres que vous n'aviez pas remarqué auparavant - peut-être parce qu'ils étaient des éléments cachés ou qu'ils ont été créés/définis par JavaScript.

+0

Je viens de regarder la section Net sur Firebug et l'ai activée. Je peux maintenant voir la requête HTTP POST elle-même et tous les paramètres envoyés. Merci pour la suggestion. Je posterai un suivi ici si je trouve quelque chose. –

Questions connexes