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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    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
    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.

  2. #2
    Membre éprouvé
    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
    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.

  3. #3
    Membre éprouvé
    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
    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.

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    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.

  5. #5
    Membre éprouvé
    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
    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.

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

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    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

+ 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