Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1272 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  Je cale sur les erreurs d'URL... ENCORE

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Je cale sur les erreurs d'URL... ENCORE

n°2000008
erwan83
Du Shift DEL tu te méfieras !
Posté le 08-06-2010 à 18:12:20  profilanswer
 

mon code :
 

Code :
  1. import httplib
  2. import urllib2
  3. inp = file("e:/liste.txt","r" )
  4. for line in inp.readlines():
  5.     print 'ADRESSE EN COURS :'
  6.     print line
  7.    
  8.     httplib.HTTPConnection.debuglevel = 1
  9.     request = urllib2.Request(line)
  10.     opener = urllib2.build_opener()
  11.     lien = opener.open(request).read()
  12.     ... et ensuite tout un tas de trucs...


mon erreur :

Code :
  1. Traceback (most recent call last):
  2.   File "E:\PROG PYTHON\URL\TestUrl.py", line 45, in <module>  //soit la lignne 12 ci dessus
  3.     lien = opener.open(request).read()
  4.   File "C:\Python25\lib\urllib2.py", line 387, in open
  5.     response = meth(req, response)
  6.   File "C:\Python25\lib\urllib2.py", line 498, in http_response
  7.     'http', request, response, code, msg, hdrs)
  8.   File "C:\Python25\lib\urllib2.py", line 425, in error
  9.     return self._call_chain(*args)
  10.   File "C:\Python25\lib\urllib2.py", line 360, in _call_chain
  11.     result = func(*args)
  12.   File "C:\Python25\lib\urllib2.py", line 506, in http_error_default
  13.     raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
  14. HTTPError: HTTP Error 404: NotFound


 
Problème : Python peut me retourner toute une batterie d'erreurs (Not found, Acces interdit etc etc etc)
Et je ne sais pas où coller un try / except dans ce code.

Message cité 1 fois
Message édité par erwan83 le 09-06-2010 à 19:02:13

---------------
http://www.ypikay.com
mood
Publicité
Posté le 08-06-2010 à 18:12:20  profilanswer
 

n°2000047
Sve@r
Posté le 08-06-2010 à 22:55:45  profilanswer
 

erwan83 a écrit :

mon code :
 

Code :
  1. import httplib
  2. import urllib2
  3. inp = file("e:/liste.txt","r" )
  4. for line in inp.readlines():
  5.     print 'ADRESSE EN COURS :'
  6.     print line
  7.    
  8.     httplib.HTTPConnection.debuglevel = 1
  9.     request = urllib2.Request(line)
  10.     opener = urllib2.build_opener()
  11.     lien = opener.open(request).read()
  12.     ... et ensuite tout un tas de trucs...


mon erreur :

Code :
  1. Traceback (most recent call last):
  2.   File "E:\PROG PYTHON\URL\TestUrl.py", line 45, in <module>  //soit la lignne 12 ci dessus
  3.     lien = opener.open(request).read()
  4.   File "C:\Python25\lib\urllib2.py", line 387, in open
  5.     response = meth(req, response)
  6.   File "C:\Python25\lib\urllib2.py", line 498, in http_response
  7.     'http', request, response, code, msg, hdrs)
  8.   File "C:\Python25\lib\urllib2.py", line 425, in error
  9.     return self._call_chain(*args)
  10.   File "C:\Python25\lib\urllib2.py", line 360, in _call_chain
  11.     result = func(*args)
  12.   File "C:\Python25\lib\urllib2.py", line 506, in http_error_default
  13.     raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
  14. HTTPError: HTTP Error 404: NotFound



 
L'erreur se situe ligne 45 sur l'instruction "lien = opener.open(request).read()"
Ca te retourne une exception " "HTTPError" ("exeption" c'est le terme pour désigner l'erreur)
 

erwan83 a écrit :

Et je ne sais pas où coller un try / except dans ce code.


 
Pour bien coller un try/except, il faut essayer de trouver l'opération la plus atomique possible qui va décider si ton traitement réussit ou échoue. Cette opération peut être sur 1, 2 ou 12 instructions.
En fait, un try/except va te garantir que tout ce que tu mets dedans sera contrôlé. Inversement, si tu mets 3 instructions et que l'une plante, tu pourras pas gérer laquelle.
 
Pour en revenir à ton code, je pense que tu peux le faire ainsi

Code :
  1. request = urllib2.Request(line)
  2. opener = urllib2.build_opener()
  3. try:
  4.    lien = opener.open(request).read()
  5. except HTTPError:
  6.    # A toi de gérer l'erreur d'ouverture
  7.    # Comme t'es dans un "for", cette gestion se terminera probablement par un "continue" pour passer à l'itération suivante
  8. # try
  9. ... et ensuite tout un tas de trucs...


Message édité par Sve@r le 08-06-2010 à 23:10:56

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°2000140
erwan83
Du Shift DEL tu te méfieras !
Posté le 09-06-2010 à 10:53:33  profilanswer
 

Merci, en fait j'ai laissé tomber httperror qui était trop complexe à gérer :
 

Code :
  1. req = urllib2.Request(adresse, data, headers)
  2.     try:
  3.         response = urllib2.urlopen(req)
  4.     except IOError:
  5.         print 'E R R E U R   D   A C C E S   U R L'
  6.         fichier_err = 'e:\\.........Erreurs_Acces.txt'
  7.         fichier_erreur = open(fichier_err,'a')
  8.         fichier_erreur.write(line)
  9.         fichier_erreur.close()
  10.     else:
  11.     # on continue


alors je ne sais pourquoi mais ça marche.
bizarre non, des problemes d' I/O sur du HTTP ?
si il faut que je me cogne les 50 et quelques codes d'erreur HTTP, ça me décourage.

Message cité 1 fois
Message édité par erwan83 le 09-06-2010 à 10:53:59

---------------
http://www.ypikay.com
n°2000327
Sve@r
Posté le 09-06-2010 à 19:02:14  profilanswer
 

erwan83 a écrit :

Merci, en fait j'ai laissé tomber httperror qui était trop complexe à gérer :
 

Code :
  1. req = urllib2.Request(adresse, data, headers)
  2.     try:
  3.         response = urllib2.urlopen(req)
  4.     except IOError:
  5.         print 'E R R E U R   D   A C C E S   U R L'
  6.         fichier_err = 'e:\\.........Erreurs_Acces.txt'
  7.         fichier_erreur = open(fichier_err,'a')
  8.         fichier_erreur.write(line)
  9.         fichier_erreur.close()
  10.     else:
  11.     # on continue


alors je ne sais pourquoi mais ça marche.
bizarre non, des problemes d' I/O sur du HTTP ?
si il faut que je me cogne les 50 et quelques codes d'erreur HTTP, ça me décourage.


 
Je sais pas pourquoi urlopen te renvoie un IOError. Mais tu peux trouver pourquoi avec un truc de ce style

Code :
  1. try:
  2.        response = urllib2.urlopen(req)
  3.  
  4. except IOError, eObject:
  5.        print 'E R R E U R   D   A C C E S   U R L - Erreur [%s]' % eObject
  6.        ...


 
Si l'exception est levée, t'auras l'objet associé qui sera récupéré par la variable "eObject". Et en l'affichant, t'auras le message d'erreur qui va avec. Comme ça tu pourras voir pourquoi le IOError.
 
De plus, t'es pas obligé de mettre l'exception précise. Tu peux laisser en blanc. Style...
 

Code :
  1. try:
  2.        response = urllib2.urlopen(req)
  3.  
  4. except:    # Quelle que soit l'exception, elle sera récupérée ici.
  5.        print 'E R R E U R   D   A C C E S   U R L'
  6.        ...


 
Tu peux aussi capturer n exceptions d'affilée. Style

Code :
  1. try:
  2.        response = urllib2.urlopen(req)
  3.  
  4. except (IOError, HTTPError, TOTOError, TRUCMUCHEError, ...), eObject:
  5.        print 'E R R E U R   D   A C C E S   U R L - Erreur [%s]' % eObject
  6.        ...


 
Quelle que soit l'exception qui correspond à la liste citée, elle sera capturée...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°2000328
erwan83
Du Shift DEL tu te méfieras !
Posté le 09-06-2010 à 19:02:57  profilanswer
 

essayez d'ouvrir ça avec python...
chez moi ça tourne en boucle sans jamais ramener d'erreur, de même sous FF ou IE
http://www.boutique-habitatmalin.com


---------------
http://www.ypikay.com
n°2000329
erwan83
Du Shift DEL tu te méfieras !
Posté le 09-06-2010 à 19:04:33  profilanswer
 

ok pas vu la réponse on a du se croiser


---------------
http://www.ypikay.com
n°2000698
Sve@r
Posté le 10-06-2010 à 22:11:12  profilanswer
 

erwan83 a écrit :

essayez d'ouvrir ça avec python...
chez moi ça tourne en boucle sans jamais ramener d'erreur, de même sous FF ou IE
http://www.boutique-habitatmalin.com


 
Chez-moi, aucun problème
 

Code :
  1. import urllib2
  2. url=urllib2.urlopen("http://www.boutique-habitatmalin.com" )
  3. for lig in url:
  4.     print lig
  5. url.close()



---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°2000701
erwan83
Du Shift DEL tu te méfieras !
Posté le 10-06-2010 à 22:22:57  profilanswer
 

fichtre !
Bon, ceci étant, je me suis permis de modifier le code du fichier Urllib2 et depuis ça marche tout seul :

Code :
  1. ...///...
  2. import bisect
  3. try:
  4.     from cStringIO import StringIO
  5. except ImportError:
  6.     from StringIO import StringIO
  7. from urllib import (unwrap, unquote, splittype, splithost, quote,
  8.      addinfourl, splitport, splitgophertype, splitquery,
  9.      splitattr, ftpwrapper, noheaders, splituser, splitpasswd, splitvalue)
  10. # support for FileHandler, proxies via environment variables
  11. from urllib import localhost, url2pathname, getproxies
  12. # used in User-Agent header sent
  13. __version__ = sys.version[:3]
  14. _opener = None
  15. def urlopen(url, data=None):
  16.     global _opener
  17.     if _opener is None:
  18.         _opener = build_opener()
  19.     try: #AJOUT
  20.         return _opener.open(url, data)
  21.     except (IOError), eObject: #AJOUT
  22.         print 'E R R E U R   URLLIB2.PY - Erreur [%s]' % eObject #AJOUT
  23.        
  24. def install_opener(opener):
  25.     global _opener
  26.     _opener = opener


De ce fait, Urllib2 me renvoie les erreurs et n'impacte plus mon code principal !!!
 
Pour l'URL du dessus ça devait planter lorsque j'ai posté car ça marche aussi chez moi !

Message cité 1 fois
Message édité par erwan83 le 10-06-2010 à 22:26:10

---------------
http://www.ypikay.com
n°2000714
Sve@r
Posté le 10-06-2010 à 23:08:21  profilanswer
 

erwan83 a écrit :

fichtre !
Bon, ceci étant, je me suis permis de modifier le code du fichier Urllib2 et depuis ça marche tout seul :

Code :
  1. ...///...
  2. import bisect
  3. try:
  4.     from cStringIO import StringIO
  5. except ImportError:
  6.     from StringIO import StringIO
  7. from urllib import (unwrap, unquote, splittype, splithost, quote,
  8.      addinfourl, splitport, splitgophertype, splitquery,
  9.      splitattr, ftpwrapper, noheaders, splituser, splitpasswd, splitvalue)
  10. # support for FileHandler, proxies via environment variables
  11. from urllib import localhost, url2pathname, getproxies
  12. # used in User-Agent header sent
  13. __version__ = sys.version[:3]
  14. _opener = None
  15. def urlopen(url, data=None):
  16.     global _opener
  17.     if _opener is None:
  18.         _opener = build_opener()
  19.     try: #AJOUT
  20.         return _opener.open(url, data)
  21.     except (IOError), eObject: #AJOUT
  22.         print 'E R R E U R   URLLIB2.PY - Erreur [%s]' % eObject #AJOUT
  23.        
  24. def install_opener(opener):
  25.     global _opener
  26.     _opener = opener


De ce fait, Urllib2 me renvoie les erreurs et n'impacte plus mon code principal !!!


Euh, modifier un fichier de librairie officielle c'est tout sauf prudent.  
1) ça rend le code inmaintenable
2) si la librairie est réinstallée, le code pffuiiit...
 
N'y avait-il pas moyen de faire autrement ??? Par exemple mettre un try dans ton code là où t'appelles urlopen plutôt que mettre le try dans la fonction urlopen elle-même ???


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°2000731
erwan83
Du Shift DEL tu te méfieras !
Posté le 11-06-2010 à 00:04:27  profilanswer
 

ben bizarrement non car je me suis retrouvé avec des erreurs que visiblement je n'arrivais pas à gerer du style connection reset by peer ou autres bizarreries qui ne portaient pas de nom d'erreur clairement définies
 
et là ça me sort ça :

Code :
  1. ADRESSE EN COURS :
  2. http://ainsi-bloggait-zarathoustra [...] ns-cet-ete
  3. E R R E U R   URLLIB2.PY - Erreur [HTTP Error 404: Not Found]  // urllib renvoie une erreur, je modifie mon code pour qu'il ne perde pas la boule car il récupère un 'NONE'
  4. http://ainsi-bloggait-zarathoustra [...] ns-cet-ete
  5. ADRESSE EN COURS :
  6. http://airnadette.blog.canalplus.fr
  7. Airnadette
  8. etc etc


---------------
http://www.ypikay.com

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  Je cale sur les erreurs d'URL... ENCORE

 

Sujets relatifs
Calcul URL relative entre 2 dossiersTransformer une URL pour chaque utilisateurs
capter les erreursprobleme pour cacher les erreurs de connexion à database
Mettre à jour une URL en temps réel selon ce qui est écrit ds 1 inputfile_get_contents avec lien URL qui marche pas
[Résolu] IE et erreurs JS incompréhensiblesMasquer repertoire en Url Rewriting ?
URL Rewriting, je deviens semi dingue, aidez moi svpCryptage asymetrique d'URL?
Plus de sujets relatifs à : Je cale sur les erreurs d'URL... ENCORE


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR