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

Python Discussion :

Gestion des Erreurs avec BeautifulSoup [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 573
    Par défaut Gestion des Erreurs avec BeautifulSoup
    Bonjour le Forum,

    Petite question sur la gestion des erreurs avec beautifulsoup et surtout avoir un code pas trop chargé
    Voici l'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            the_dict['full_name'] = soup.find("div",{"id":"123"}).findAll("span",{"class":"nom"})[0].text.strip()
            the_dict['function'] = soup.find("div",{"id":"123"}).findAll("span",{"class":"titre"})[0].text.strip()
            the_dict['email'] = soup.find("div",{"id":"123"}).findAll("p",{"class":"email"})[0].find("a").text.strip()
    Le soucis est que si ca plante (le find renvoi None) sur une des lignes le code s'arête (Puisque None n'a pas de fonction .text)
    Une solution est de mettre des try/except .... donc à toutes les lignes : c'est un peu crade
    Autre solution, coller à la fin de chaque ligne un if soup.find(....) else ''
    Ou encore découper la ligne en faisant le .text.strip() uniquement si la valeur n'est pas None

    Je trouve ces 3 solutions un peu "moches", on rajoute beaucoup de ligne, ca nuit à la lisibilité du code.
    Existe t'il une solution plus propre et plus lisible ?

    Merci pour votre aide

    Thais

  2. #2
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Si on veut perturber l'écriture en place déjà, on peut faire comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            #the_dict['full_name'] = soup.find("div",{"id":"123"}).findAll("span",{"class":"nom"})[0].text.strip()
            the_dict['full_name'] = soup.find("div",{"id":"123"}).findAll("span",{"class":"nom"})[0].text.strip() if not Exception else 'n/a'
    Si on veut capturer l'erreur plus tôt, on peut faire comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            #the_dict['full_name'] = soup.find("div",{"id":"123"}).findAll("span",{"class":"nom"})[0].text.strip()
            nodelist=soup.find("div",{"id":"123"}).findAll("span",{"class":"nom"})
            the_dict['full_name'] = nodelist[0].text.strip() if len(nodelist)!=0 else 'n/a'
    (remplacer 'n/a' ce qu'on veut).

    En ce qui concerne 'moches', j'en passe.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 573
    Par défaut
    Bonjour tsuji,

    Merci pour ta reponse.
    Petite précision svp :
    C'est l'équivalent de try: except: ?

    Dsl pour le moche ;-))
    Je pensai a une subtilité de "find" qui gererai ce type d'exception directement sans être obligé de rajouter de IF ou des TRY partout ...

    Thais

  4. #4
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    J'ai oublié de taper une petite particule dans la première phase "Si on veut perturber le moins possible l'écriture en place déjà ...", c'est ce que j'entends dire - mais rien de grave.

    Et puis, la deuxième partie n'est évidemment pas suffisante, ma faute, quand on enchaîne multiple find ou findAll ou findNext ... mais la première solution reste valable. Quand on a la téchnologie d'xpath disponible, on peut condenser tous critères engendrés par une expression de xpath et il n'y aurait pas ce problème. Pourtant on ne l'a pas en BeautifulSoup et encore ce n'est pas grave.

    L'importance c'est la première écriture utilisant l'opération ternaire reste valable. L'écriture 'if not Exception else' peut être écrire comme 'if not Exception() else', si c'est plus claire, est la partie constituante de l'opération ternaire (par exemple, https://docs.python.org/3/reference/expressions.html, section 6.13). Mais cet usage est du mien et je ne l'ai pas vu null part ailleurs - et j'espère c'est bon. Avec cette écriture, on peut avoir enchaîné multiple find sans problème, ainsi rendu plus proche du comportement de xpath. Voilà ce que je puisse dire.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 704
    Par défaut
    Salut,

    Citation Envoyé par tsuji Voir le message
    L'écriture 'if not Exception else' peut être écrire comme 'if not Exception() else', si c'est plus claire
    Vous pouvez toujours écrire 'if not Exception() else...' sauf que Exception() sera évalué à True (sans attraper l'exception si elle a eu lieu) comme n'importe quelle instance de classe (qui n'implémente pas les méthodes qui en ferait un "booléen").

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Oui, j'etais trop basé sur des built-in's, ma faute. Pour exécuter en script, on est forcé de faire expliciter pour ne pas faire plus sur la gestion d'Exceptions, comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            #the_dict['full_name'] = soup.find("div",{"id":"123"}).findAll("span",{"class":"nom"})[0].text.strip()
            the_dict['full_name'] = soup.find("div",{"id":"123"}).findAll("span",{"class":"nom"})[0].text.strip() if soup.find("div",{"id":"123"}) and soup.find("div",{"id":"123"}).findAll("span",{"class":"nom"}) else 'n/a'
    Du coup, ça semble moins efficace mais nécessaire.

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

Discussions similaires

  1. Gestion des erreur avec aspSmartUpload
    Par zooffy dans le forum ASP
    Réponses: 2
    Dernier message: 07/12/2007, 09h39
  2. gestion des erreurs avec fichier .properties
    Par _momo dans le forum Struts 1
    Réponses: 2
    Dernier message: 20/08/2007, 14h05
  3. [J2EE/JSP] Gestion des erreurs avec une base SQL server 2005
    Par critok dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 30/04/2006, 16h57
  4. Gestion des erreurs avec setjump/longjump
    Par gege2061 dans le forum C
    Réponses: 1
    Dernier message: 05/02/2006, 15h51

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