IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

Encoder une requète non-ASCII


Sujet :

Réseau/Web Python

  1. #1
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut Encoder une requète non-ASCII
    Salut les WebPythons,
    Je suis des votre et j'écrit un programme de recherches avancées pour google.
    C'est en mode text: les requètes sont faite par httplib.
    Mais je suis tomber sur un os: les caractères non-ASCII sont formater et je cherche une solution afin de pouvoir faire des requètes non-ASCII.
    les requètes sont faite avec httplib, un bout de code pour comprendre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    conn=httplib.HTTPConnection('www.google.fr')
    conn.request("POST",'/search?q=allintext:dévellopez.com+python',self.params,self.headers)#j'ai mis le "é" exprès
    answers=self.conn.getresponse()
    data=self.answers.read()
    Ce qui ne marche pas: unicode error can't decode \xc3\xa9 (str('é') == \xc3\xa9 )

    Alors après des essais avec urllib, le code suivant marche en ligne de commande mais pas en intégrer dans mon programme, sa bug sur urllib.urlopen.
    unicode error can't decode \xc3\xa9 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    a=urllib.urlopen('http://www.google.com/search?q=allintext:Tarek+Ziadé')
    a.geturl()
    'http://www.google.com/search?q=allintext:Tarek+Ziad%C3%A9'
    Je cherche une méthode afin de formater les caractères ,non-ASCII comme çi-dessus.
    afin de fournir comme paramètre a httplib.request(), j'ai regarder dans urllib.urlencode() mais ce n'est pas ce dont j'ai besoin.

    Si quelqu'un connait le problème ou si vous avez une solution (j'ai déja tout essayer ce que j'ai pu) merci de poster.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  2. #2
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Bon personne a une idée comment encoder une requète avec des caractères non-ASCII, ce que je comprend pas c'est que quand j'intègre ces lignes qui remplace la requète avec httplib dans mon programme par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    a=urllib.urlopen('http://www.google.com/search?q=allintext:Tarek+Ziadé')
    a.geturl()
    'http://www.google.com/search?q=allintext:Tarek+Ziad%C3%A9'
    a.read() #pourrait faire l'affaire pour nourrir mon Parser
    Fonctionne en ligne de commande alors que quand je donne la meme URL avec la meme méthode intégrer dans mon programme ca ne marche plus et déclenche une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <type 'exceptions.UnicodeError'>: URL u'http://www.google.com/search?q=allintitle:Tarek+Ziad\xe9' contains non-ASCII characters
    Ou si je procède comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    a=urllib.urlopen(str(http://www.google.com/search?q=allintext:Tarek+Ziadé))
    a.geturl()
    'http://www.google.com/search?q=allintext:Tarek+Ziad%C3%A9'
    a.read() #pourrait faire l'affaire pour nourrir mon Parser
    J'obtiens le traceback suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <type 'exceptions.UnicodeEncodeError'>: 'ascii' codec can't encode character u'\xe9' in position 52: ordinal not in range(128)

    Episode 2:
    j'ai réussi a passer une requète non-ASCII avec httplib mais je n'obtiens pas de réponse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    self.conn=httplib.HTTPConnection('www.google.com')
    self.conn.putrequest('POST','/search?q=allintext:Tarek+Ziadé', skip_host=True, skip_accept_encoding=True)
    self.antwort=self.conn.getresponse() #ca bug ici maintenant
    Le traceback est de type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Traceback (innermost last):
      File "/usr/lib/python2.6/dist-packages/Pmw/Pmw_1_3/lib/PmwBase.py", line 1747, in __call__
        return apply(self.func, args)
      File "Googler_144.py", line 973, in googlen
        motor.konnecktion()
      File "Googler_144.py", line 953, in konnecktion
        self.antwort=self.conn.getresponse()
      File "/usr/lib/python2.6/httplib.py", line 976, in getresponse
        raise ResponseNotReady()
    <class 'httplib.ResponseNotReady'>:
    Ce qui est déja un pas en avant, si quelqu'un sait comment obtenir une réponse, je suppose qu'il faut envoyer la requéte construit avec putrequest() Merci de poster.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  3. #3
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut A l'aide
    Suite a votre non-assistance de programme qui bug,
    et votre non assistance a programmeur énerver parce que son programme bug: j'ai tabasser mon clavier et jeter mon ordinateur par la fenetre qui a malheureusement attéri sur la tete de mon voisin ce qui fait que je vais passer au tribunal pour crime avec ordinateur, du coup je suis le roi du CAC (Computer Aided Crime) dans mon village.
    Merci de poster si vous avez une idée sur le sujet (requète non-ASCII avec httplib) ou simplement me dire que ce n'est pas possible...
    Si vous savez si peut etre avec le module 2to3, python 3 étant basé sur l'unicode, il y a peut etre une solution mais je crois que dans les URL les caractères spéciaux sont encoder quand meme.
    Histoire d'aide psychologique que je tienne le coup pour le procès.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour Luke spywoker,

    Pour accélérer les réponses, et éviter ainsi ta condamnation , je te suggère de nous donner un petit code montrant le problème, mais suffisamment complet pour qu'on puisse l'essayer chez nous par simple copier-coller.

    Et dire avec quelle version de Python tu fais ça.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Je tourne sous Python 2.6.5 et j'ai fait le plus simplement possible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    from Tkinter import *
    import httplib
     
    def get_filter(event) :
      global select, requete
     
      if int(select.curselection()[0]) == 0 :
        requete.delete(0.0, END)
        requete.insert('0.0', '/search?q='+'intext:'+choosed.get().replace(' ','+'))
      if int(select.curselection()[0]) == 1 :
        requete.delete(0.0, END)
        requete.insert('0.0', '/search?q='+'allintext:'+choosed.get().replace(' ','+'))
      if int(select.curselection()[0]) == 2 :
        requete.delete(0.0, END)
        requete.insert('0.0', '/search?q='+'intitle:'+choosed.get().replace(' ','+'))
      if int(select.curselection()[0]) == 3 :
        requete.delete(0.0, END)
        requete.insert('0.0', '/search?q='+'allintitle:'+choosed.get().replace(' ','+'))  
     
     
    def rechercher() :
     
      motor=httplib.HTTPConnection('www.google.com')
      headers={"Content-type":"application/x-www-form-urlencoded","Accept":"text/plain"}
      motor.request('POST', requete.get(0.0, END), body=None, headers=headers) #Ca bug ici !!! peut etre dans la config des headers ???
      response=motor.getresponse() 
      response.read() #Si vous passez une requète contenant des caractères non-ASCII et avez une page html qui sort ici c'est bon.
     
     
    fen=Tk()
    info_filter=Label(fen, text='Filtres:')
    select=Listbox(fen, height=4)
    select.insert(0, 'intext')
    select.insert(1, 'allintext')
    select.insert(2, 'intitle')
    select.insert(3, 'allintitle')
    select.bind('<Double-Button-1>', get_filter)
    info_search=Label(fen, text='Search:')
    choosed=Entry(fen)
    info=Label(fen, text='Entrez un mot a rechercher\n Avec un|des caractères non-ASCII\net sélectionner le filtre a appliquer.')
    info_request=Label(fen, text='request')
    but=Button(fen, text='Envoyer requète', command=rechercher)
    requete=Text(fen, height=1, width=25)
    requete.insert('0.0', '/search?q=')
    info_filter.grid(row=0, column=0)
    select.grid(row=0, column=1)
    info_search.grid(row=1, column=0)
    choosed.grid(row=1, column=1)
    info.grid(row=0, rowspan=2, column=2)
    info_request.grid(row=2, column=0)
    requete.grid(row=2, column=1, columnspan=2, sticky=EW)
    but.grid(row=3, column=0, columnspan=3, sticky=EW)
    choosed.focus_set()
    fen.mainloop()
    Merci pour ta démarche tyrtamos dans ta volonté de m'aider,
    je crois que vais choisir l'injection.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  6. #6
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    bonjour,

    je colle l'exemple de la doc python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> import httplib, urllib
    >>> params = urllib.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})
    >>> headers = {"Content-type": "application/x-www-form-urlencoded",
    ...            "Accept": "text/plain"}
    >>> conn = httplib.HTTPConnection("bugs.python.org")
    >>> conn.request("POST", "", params, headers)
    >>> response = conn.getresponse()
    >>> print response.status, response.reason
    302 Found
    >>> data = response.read()
    >>> data
    'Redirecting to <a href="http://bugs.python.org/issue12524">http://bugs.python.org/issue12524</a>'
    >>> conn.close()
    je pense qu'il te faut encoder tes paramètres pour la requete, sans les mettre en dur dans l'url
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> params = urllib.urlencode({'q':  'monthy python'})
    Pour ton procès, je me range du côté de la partie civile, pour défendre ce pauvre ordinateur, qui ne fait que ce que tu lui demandes, pov' petit pc
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  7. #7
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Meci je n'avais pas vu cette partie de la doc et je me doutais que ce procès de devoir encoder les requètes au lieu de les mettres en dur me pendait au nez, bon au boulot il faut que je remanie mon pogramme et merci mais je ne comprend toujours pas pourquoi des trucs fonctionnent en ligne de commande et pas intéger dans mon programme (voir plus haut) avec urllib, je vous dirai si avec un appel a urllib.urlencode() intégrer dans mon programme marche, j'avais un problème similaire avec la création de fichier en ligne de commande qui fonctionnais mais pas intégrer dans un script exécuter et si dans un programme compiler sous Windows.
    Je crois que je vais demander une soupe de langue de serpent comme dernier repas.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

  8. #8
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    OOOOUIAIS, j'y suis arriver avec un appel a urllib.urlencode() bien sniper dans la requète de httplib:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import urllib, httplib
    headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
    encoded=urllib.urlencode({'allintitle:':'développez.com'})
    conn=httplib.HTTPConnection('www.google.com')
    conn.request('GET', '/search?q='+encoded,"",headers)
    response=conn.getresponse()
    response.read()
    J'ai pu nourrir mon parser avec: c'est super grand merci a tyrtamos et a pacificator pour leur soutien et leur aide précieuse.

    J'ai été relaxer sous prétexte que c'est l'ordinateur qui est en cause comme responsable du coup sur la tete a mon voisin car il aurai sauter de la fentre par lui meme, c'est lui qui va se présenter a son procès moi je suis hors de cause.
    Pour faire tes armes:
    Use du présent pour construire ton futur sinon use de ce que tu as appris auparavant.
    Et sois toujours bien armé avant de te lancer.
    Le hasard ne sourit qu'aux gens préparés...
    Site: Website programmation international (www.open-source-projects.net)
    Site: Website imagerie 3D (www.3dreaming-imaging.net)
    Testez aux moins pendant une semaine l'éditeur avec terminaux intégrées it-edit Vous l'adopterai sûrement !
    FUN is HARD WORK !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Etat d'une requête non figée
    Par pikameuh dans le forum VBA Access
    Réponses: 7
    Dernier message: 30/05/2011, 08h29
  2. [Liferay] Envoi d'une requête non gérée par le portail
    Par Geo_novay dans le forum Portails
    Réponses: 1
    Dernier message: 21/05/2009, 13h02
  3. Besoin d'aide pour une requête non correspondance
    Par isabelle b dans le forum Requêtes et SQL.
    Réponses: 35
    Dernier message: 23/06/2008, 00h30
  4. Exécuter une requête non-query
    Par Piet dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 07/02/2007, 15h01
  5. [MySQL] Retour d'une requête non voulue
    Par gregal dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 26/04/2006, 15h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo