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 :

Parser du xml en python


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2013
    Messages : 63
    Points : 38
    Points
    38
    Par défaut Parser du xml en python
    bonjour a tous je travaille sur une application python et j'utilise la lib suds pour faire appel a un web service. j'obtiens comme retour un brin de xml que j'essaye de parser mais en vain. d'abord j'ai pu voir pas mal de libs permettant de le faire mais le problème est que celles-ci traitent plutôt de fichiers xml alors que moi je traite directement ma reponse dans mon script. quelqu'un pourrait-il donc me proposer quelque chose d'autre. voici la reponse que le web service m'envoie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?xml version="1.0" encoding="utf-16"?>
    <CurrentWeather>
      <Location>Abidjan, Cote d'Ivoire (DIAP) 05-15N 003-56W 8M</Location>
      <Time>Jan 06, 2015 - 05:30 AM EST / 2015.01.06 1030 UTC</Time>
      <Wind> from the N (360 degrees) at 8 MPH (7 KT) (direction variable):0</Wind>
      <Visibility> 1 mile(s):0</Visibility>
      <Temperature> 78 F (26 C)</Temperature>
      <DewPoint> 59 F (15 C)</DewPoint>
      <RelativeHumidity> 50%</RelativeHumidity>
      <Pressure> 29.94 in. Hg (1014 hPa)</Pressure>
      <Status>Success</Status>
    </CurrentWeather>

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Si vous n'avez pas de besoins plus exotiques, la bibliothèque ElementTree devrait suffire.
    note: et plus particulièrement la méthode .fromstring

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2013
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    ok sauf que avec cette methode je stocke mon retour xml dans une variable de type string que je passe par la suite, en paramètre à la methode fromstring, j'obtiens cette erreur:
    xml.etree.ElementTree.ParseError: encoding specified in XML declaration is incorrect

    voici le code:

    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
     
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    from suds.client import Client
    import xml.etree.ElementTree as ET
     
    my_ws=Client("http://www.webservicex.net/globalweather.asmx?WSDL")
     
    result=my_ws.service.GetWeather("abidjan","cote d'ivoire")
     
    string_xml=""
    string_xml=string_xml+result
    root=ET.fromstring(string_xml)

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par roadbecri Voir le message
    ok sauf que avec cette methode je stocke mon retour xml dans une variable de type string que je passe par la suite, en paramètre à la methode fromstring, j'obtiens cette erreur:
    xml.etree.ElementTree.ParseError: encoding specified in XML declaration is incorrect
    Cà fonctionne avec le string que vous avez posté précédemment.
    Que contient le string passé à fromstring?

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

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2013
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    il contient le retour xml tel que ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?xml version="1.0" encoding="utf-16"?>
    <CurrentWeather>
      <Location>Abidjan, Cote d'Ivoire (DIAP) 05-15N 003-56W 8M</Location>
      <Time>Jan 06, 2015 - 11:00 AM EST / 2015.01.06 1600 UTC</Time>
      <Wind> from the N (360 degrees) at 6 MPH (5 KT) (direction variable):0</Wind>
      <Visibility> 2 mile(s):0</Visibility>
      <Temperature> 87 F (31 C)</Temperature>
      <DewPoint> 51 F (11 C)</DewPoint>
      <RelativeHumidity> 29%</RelativeHumidity>
      <Pressure> 29.83 in. Hg (1010 hPa)</Pressure>
      <Status>Success</Status>
    </CurrentWeather>

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Effectivement je reproduis votre problème avec Python 2.7 et c'est un bug connu.
    Si vous ne pouvez pas utiliser une version plus récente, il faudra essayez avec une bibliothèque externe genre lxml.

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

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2013
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    désolé mais quand je vérifie le type du string en question à l'aide de la commande type(nom_du_string), j'obtiens ce resultat:

    il semblerait que son type ait changé. Pouvez-vous svp m'éclairer?? merci d'avance

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2013
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    ok compris merci je verrai comment fonctionne lxml

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2013
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    Désolé de refaire encore surface. j'ai essayé avec la lib lxml comme vous me l'avez suggéré et sauf erreur de ma part il me semble que la methode fromstring n'autorise pas les string unicode comme paramètre, ci-dessous mon brin de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    import lxml
    from suds.client import Client
    from lxml import etree
     
    server=Client("http://www.webservicex.net/globalweather.asmx?WSDL")
    reponse=server.service.GetWeather("lome","togo")
     
    texte=""
    xml_string=texte+reponse
    root=etree.fromstring(xml_string)
    voici en quelque sorte l'erreur que j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "<pyshell#71>", line 1, in <module>
        root=etree.fromstring(texte)
      File "lxml.etree.pyx", line 3092, in lxml.etree.fromstring (src\lxml\lxml.etree.c:70473)
      File "parser.pxi", line 1823, in lxml.etree._parseMemoryDocument (src\lxml\lxml.etree.c:106272)
    ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.
    Je me demande alors à quoi peut-être du ce problème???

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Vous répondez vous même à votre question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.
    Citation Envoyé par roadbecri Voir le message
    désolé mais quand je vérifie le type du string en question à l'aide de la commande type(nom_du_string), j'obtiens ce resultat:

    => le client suds remonte de l'unicode dans lequel est écrit "je suis une suite de bytes encodés en utf-16" lxml n'aime pas.
    Le plus simple est de transformer la chaîne en bytes encodés utf-16 (via encode) et de passer la chose à lxml


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

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2013
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    => le client suds remonte de l'unicode dans lequel est écrit "je suis une suite de bytes encodés en utf-16" lxml n'aime pas.
    Le plus simple est de transformer la chaîne en bytes encodés utf-16 (via encode) et de passer la chose à lxml
    Bonjour à vous wiztricks et grand merci pour votre aide, en effet j'ai transformé la chaine via encode comme vous me l'avez recommandé et ça passe. je peux maintenant manipuler les différents éléments de mon xml.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    import xml.etree.ElementTree as ET
    root=ET.fromstring(string_xml.encode('utf-16'))

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

Discussions similaires

  1. parser un fichier xml en python
    Par titi2013 dans le forum Général Python
    Réponses: 1
    Dernier message: 05/03/2014, 13h08
  2. [C#] Parser du XML
    Par karl3i dans le forum Windows Forms
    Réponses: 5
    Dernier message: 27/02/2009, 09h46
  3. [DOM XML] Comment parser du XML avec une version 4.3 ?
    Par ouioui2000 dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 18/10/2005, 15h52
  4. [FLASH MX2004] Parser un XML en action script
    Par jejeman dans le forum Flash
    Réponses: 6
    Dernier message: 20/09/2005, 17h25
  5. [XSL] Parser fichier xml : erreurs + incompréhensions
    Par totobouchon dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 19/07/2005, 15h47

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