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

Je cale sur les erreurs d'URL... ENCORE - Python - Programmation

Marsh Posté le 08-06-2010 à 18:12:20    

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
Reply

Marsh Posté le 08-06-2010 à 18:12:20   

Reply

Marsh Posté le 08-06-2010 à 22:55:45    

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.
Reply

Marsh Posté le 09-06-2010 à 10:53:33    

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
Reply

Marsh Posté le 09-06-2010 à 19:02:14    

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.
Reply

Marsh Posté le 09-06-2010 à 19:02:57    

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
Reply

Marsh Posté le 09-06-2010 à 19:04:33    

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


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

Marsh Posté le 10-06-2010 à 22:11:12    

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.
Reply

Marsh Posté le 10-06-2010 à 22:22:57    

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
Reply

Marsh Posté le 10-06-2010 à 23:08:21    

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.
Reply

Marsh Posté le 11-06-2010 à 00:04:27    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed