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 :

Extraire des données d'un fichier html


Sujet :

Python

  1. #1
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut Extraire des données d'un fichier html
    Bonjour,
    Je suis grand débutant en python et je cherche à extraire des données d'une page html.
    Je me suis dirigé vers urllib2, peut-être à tord...

    Je souhaite extraire ces données et les réutiliser ensuite pour les insérer dans un fichier .tex.
    Il faut donc que je les stocke.

    Après 48h de recherche, je suis revenu au point de départ avec un code qui ne marche pas, je ne comprends pas pourquoi. Le voici :

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    #avec python2.7 pour urllib
     
     
    import urllib2
    u = urllib2.urlopen("http://www.meteociel.fr/observations-meteo/temps-reel.php")
    fich = u.read()
    u.close()
    f = open("data1.txt","w")
    f.write(fich)
    f.close()
     
    import sys, re
    # on sélectionne le texte entre les balises
    rec_cont=re.compile('<meta name="keywords".*?français">',re.M|re.S)
     
    with open("data1.txt",'r') as f : #ouverture du fichier data1
       lignes=f.read()
       n=0
       for k in rec_cont.findall(lignes) :
          n+=1
          with open("data2.txt", 'w') as g:
    		  g = open("data2.txt", 'w')
    		  contenu=str(rec_cont.findall(ligs))
    		  g.write(contenu)
    		  g.close()
    je souhaite donc réutiliser les données de contenu dans un deuxième temps, ce que je n'arrive pas à faire.
    La cerise sur le gâteau, c'est que le fichier data1.txt est bien créé mais pas data2.txt !
    Si quelqu'un peut me donner des idées (simples car j'essaie de m'y mettre)...
    Pas d'aide par mp.

  2. #2
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 656
    Points : 1 153
    Points
    1 153
    Par défaut
    Salut,

    Je n'utilise jamais les expressions régulières, donc je ne pourrais pas t'être d'un grand secours sur ce point. Cependant je note deux/trois trucs étranges dans ton code:
    1- Pourquoi manipuler 2 fichiers textes?
    2- Pourquoi ouvrir plusieurs fois le fichier data2.txt avec l'attribut 'w'?

    Sur le premier point, c'est peut-être un choix motivé de ta part, donc passons.

    Le deuximème point est plus problématique. Tu ouvre un fichier nommé data2.txt en écriture seule ('w') et donc tu écrase tout ce qui pouvait y être inscrit au préalable...

    Ensuite, le with open suivit d'un autre open... Bref. Je remplacerais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for k in rec_cont.findall(lignes) :
          n+=1
          with open("data2.txt", 'w') as g:
    		  g = open("data2.txt", 'w')
    		  contenu=str(rec_cont.findall(ligs))
    		  g.write(contenu)
    		  g.close()
    Par cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    g = open("data2.txt", 'w')
    for k in rec_cont.findall(lignes) :
        n+=1
        contenu=str(rec_cont.findall(ligs))
       g.write(contenu)
    g.close()
    Chez moi, avec python 2.7 également, je peux lire ta page web, mais rec_cont.findall(lignes) correspond à une liste vide. Mais comme je te l'ai dit plus haut, les expressions régulières c'est pas mon truc.

    Ciao,


    Ju

  3. #3
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Citation Envoyé par Julien N Voir le message
    Salut,

    Je n'utilise jamais les expressions régulières, donc je ne pourrais pas t'être d'un grand secours sur ce point. Cependant je note deux/trois trucs étranges dans ton code:
    1- Pourquoi manipuler 2 fichiers textes?
    2- Pourquoi ouvrir plusieurs fois le fichier data2.txt avec l'attribut 'w'?

    Ju
    Merci pour ces remarques.
    Effectivement, pour le premier point, c'est un choix qui me permet de voir ce qui se passe pas à pas (je manipule ensuite les données et en phase d'apprentissage, j'aime bien comprendre...).
    Pour le deuxième point, c'est effectivement une erreur de ma part.

    Sinon, mon fichier data2.txt est effectivement vide car rec_cont.findall(lignes) est vide, ce qui ne me paraît pas normal.
    Pas d'aide par mp.

  4. #4
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 656
    Points : 1 153
    Points
    1 153
    Par défaut
    Ok, parfait.

    Je peux peut-être t'aider quand même pour ce qui est du traitement de la page html. Du moins te proposer une béquille!

    Qu'est-ce que tu cherche à récupérer exactement?

    Ju

  5. #5
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    En fait pour l'instant, j'essaie de trouver des applications utiles à ce que je vais enseigner à la rentrée prochaine

    Pour l'instant, je joue donc avec de petits fichiers et ce site m'a donné une idée :

    http://snouffy.free.fr/blog-fr/index...mater-en-LaTeX

    Le fichier proposé ne marche pas chez moi et j'ai donc décidé de m'en faire un, dans l'objectif de m'entraîner.

    Je souhaite donc à partir d'une recette par exemple (interdiction de rire !), la réécrire en LaTeX. (Pour ce qui est du passage en LaTeX, je n'ai pas de souci.)

    Pour cela, j'ai besoin des différentes informations : titre, temps de préparation, ... et j'ai besoin de les stocker dans des variables afin de les insérer dans mon fichier tex final.
    Pas d'aide par mp.

  6. #6
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 656
    Points : 1 153
    Points
    1 153
    Par défaut
    Pas mal du tout comme idée!

    Pour ma part je me suis entrainé avec la récupération de données boursières sur des sites comme yahoo finance.

    Je n'ai pas été très loin cependant. Je te conseille de jeter un oeil du côté de HTMLParser. Ce module python permet de récupérer "facilement" des infos depuis un code html.

    Voici un exemple avec la bourse:

    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
    # -*- coding:Utf-8 -*-
    import urllib2
    import HTMLParser
     
    class Parser(HTMLParser.HTMLParser):
        """  Parser test """
        def __init__(self):
            HTMLParser.HTMLParser.__init__(self)
            self.FindOuverture = False
            self.OuvertureValue = 0.0       
     
        def handle_data(self,data):
            if self.FindOuverture:
                self.OuvertureValue = float(data.replace(',','.'))
                self.FindOuverture = False
            if data == 'Ouverture:':
                self.FindOuverture = True
     
        def DisplayData(self):
            print ("Ouverture: " + str(self.OuvertureValue))
     
     
    if __name__ == "__main__":
     
        parser = Parser()
        webPage = urllib2.urlopen("http://fr.finance.yahoo.com/q?s=SPM.MI")
     
        html = webPage.read()
        parser.feed(html)
     
        parser.DisplayData()
        parser.reset() 
        parser.close()
    Ici j'ai copié l'architecture d'un code trouvé sur internet. Je créé une classe Parser qui hérite de la classe HTMLParser.HTMLParser. Tu vois que dans le constructeur (def __init__(self) ), j'appel le constructeur de HTMLParser.HTMLParser. J'ai créé une methode handel_data me permettant de traiter mes données (ici presque rien d'ailleurs).

    Dans mon main, je fourni au parser la page html à traiter grâce à la méthode .feed provenant de HTMLParser.HTMLParser (l'héritage).

    Le but du programme étant de récupérer la valeur boursière à l'ouverture d'un titre en particulier.

    Le problème c'est que le site à analyser doit être "bien fait". Cela ne marche pas avec le site météo que tu as donné. Sans doute à cause de la carte.

    Je pourrais pas vraiment t'aider plus que cela, ça dépasse mes compétences..

    Ciao

  7. #7
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Merci, c'est un peu compliqué pour moi pour l'instant.
    Je n'ai pas tout compris au niveau des classes et héritages mais je vais m'y mettre...

    Pour l'instant, j'ai enregistré sous forme de fichier texte la page que tu m'as indiquée, ce qui donne le code suivant :

    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
    # -*- coding:Utf-8 -*-
    import urllib2
    import HTMLParser
     
    class Parser(HTMLParser.HTMLParser):
        """  Parser test """
        def __init__(self):
            HTMLParser.HTMLParser.__init__(self)
            self.FindOuverture = False
            self.OuvertureValue = 0.0       
     
        def handle_data(self,data):
            if self.FindOuverture:
                self.OuvertureValue = float(data.replace(',','.'))
                self.FindOuverture = False
            if data == 'Ouverture:':
                self.FindOuverture = True
     
        def DisplayData(self):
            print ("Ouverture: " + str(self.OuvertureValue))
     
     
    if __name__ == "__main__":
     
        parser = Parser()
        webPage = urllib2.urlopen("http://fr.finance.yahoo.com/q?s=SPM.MI")
     
        html = webPage.read()
        parser.feed(html)
     
        parser.DisplayData()
        parser.reset() 
        parser.close()
        f = open("data1.txt","w")
        f.write(html)
        f.close()
    Ce que je voudrais à partir du fichier texte data1.txt (ou de la page directement), c'est par exemple extraire et enregistrer la chaîne : cours détaillé pour SAIPEM de la ligne :

    <title>SPM.MI : cours détaillé pour SAIPEM- Yahoo! France Finance</title>

    Merci en tous cas pour cet exemple avec htmlParser
    Pas d'aide par mp.

  8. #8
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut [Résolu]
    Bon, j'ai réussi ce que je voulais avec BeautifulSoup.

    Par contre, je ne vois pas comment éditer mon premier message afin de le noter comme résolu.

    Edit : trouvé !
    Pas d'aide par mp.

  9. #9
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 656
    Points : 1 153
    Points
    1 153
    Par défaut


    Tu seras peut-être intéressé par cet article:

    http://sametmax.com/comment-parser-d...vec-des-regex/

  10. #10
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Il y a des choses un peu plus complètes en anglais.
    Pas d'aide par mp.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/01/2010, 22h30
  2. [Excel] Extraire des données d'un fichier xls en php
    Par splinternabs dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 06/04/2006, 09h11
  3. Extraire des donnés d'un fichier texte
    Par sadsad dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2006, 15h09
  4. Réponses: 7
    Dernier message: 29/09/2005, 10h19
  5. extraire des données d'un code HTML
    Par blueice dans le forum Langage
    Réponses: 5
    Dernier message: 19/08/2004, 19h41

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