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 valeur entre balises


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2018
    Messages : 9
    Par défaut extraire valeur entre balises
    Bonjour à tous,

    Je découvre avec émerveillement la programmation. J'ai choisi Python et Pycharm.
    Pour mon premier programme (dans un cadre pro mais ce n'est pas du tout mon métier à la base), je souhaite aller récupérer les données d'un site web pour les restituer en fichier excel.

    Je n'arrive pas à trouver comment extraire le texte (que j'ai mis en rouge) de cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <div class="Formation-nextsession"><b>Prochaine session :</b> Entrée sur demande</div> <div class="Formation-details">
    Mon code est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prochaine_session = liste.find('div', class_='Formation-nextsession')
    mais bien sur je me trouve avec le résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <div class="Formation-nextsession"><b>Prochaine session :</b> Entrée sur demande</div> <div class="Formation-details">
    <img alt="Picto map marker" src="/themes/custom/c2rp/pictos/map_marker_grey.svg"/>
    <span>Laon</span>
    <span class="divider"></span>
    <img alt="Picto horaire" src="/themes/custom/c2rp/pictos/clock.svg"/>
    <span>
            Total : <b>200h</b>
    </span>
    </div>
    Nota : je vais aussi avoir besoin du nombre d'heures (en vert) et de la ville (en bleu)

    Surement l'un de vous pourra m'accompagner pour m'aider à trouver la solution, pour les autres lignes, j'ai tout bien compris et cela fonctionne comme je le souhaite.

    Merci à vous et bonne journée
    Christelle_B

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Christelle_B Voir le message
    Mon code est : prochaine_session = liste.find('div', class_='Formation-nextsession')mais bien sur je me trouve avec le résultat suivant...
    Bien sûr bien sûr c'est un peu vite dit. C'est quoi "liste"? Son type? Que contient-elle? Comment elle a été créée? Ce ne peut pas être un str car la méthode str.find() ne prend pas de mot clef en paramètre (donc on ne peut pas écrire "class_="). Donc il s'agit d'une autre méthode find() mais si tu ne dis pas de quel objet elle provient on ne pourra pas grand chose.
    Ce qui te semble évident ne l'est pas pour ceux qui ne connaissent pas le contexte...

    PS: nommer sa variable "liste" alors qu'il existe le type "list" n'aide pas à la clarté du code...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre régulier
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2018
    Messages : 9
    Par défaut
    Bonjour Sve@r

    je ne sais pas si cela peut aider davantage, voici le code complet :

    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
    import requests
    from bs4 import BeautifulSoup
    from csv import writer
     
    #C2RP - financeur : Conseil Régional / Niveau : tous sauf 1 / Caractéristiques : Formations certifiantes
     
    url = "https://formations-en-hauts-de-france.c2rp.fr/recherche/resultats?size=20&type=FC&radius=100&financeurs=Conseil+R%C3%A9gional+Hauts-de-France%7CConseil%20R%C3%A9gional%20Hauts-de-France&niveaux=2%7C3%7C4%7C5%7C6%7C7%7C8%7C9%7C0&caracteristiques=FL_FOR_CER&query=&codePostal="
    page = requests.get(url)
     
     
    #links_with_text = []
    soup = BeautifulSoup(page.content, 'html.parser')
    listes = soup.find_all('article', class_="Formation")
     
    #with open('housing.csv', 'w', encoding='utf8', newline='') as f:
    #    thewriter = writer(f)
    #    header = ['Intitule', 'OF', 'Session', 'Prochaine Session', 'Ville', 'Duree']
     
     
    for liste in listes :
    #    intitule = liste.find('a', href=True).text.replace('\n', '')
    #   of = liste.find('div', class_='Formation-organism').text.replace('\n', '')
    #   session = liste.find('div', class_='Formation-sessions').text.replace('\n', '')
        prochaine_session = liste.find('div', class_='Formation-nextsession')
     
    #   ville = liste.find('div', class_="Formation-details")
    #   duree = liste.find('div', class_="Formation-details")
     
        info = [prochaine_session]
        print(info)
    A ce stade, j'ai "neutralisé" les lignes "Formation-details" car j'ai le même problème avec la ligne prochaine session. Voici que ce je renvoie :

    [<div class="Formation-nextsession"><b>Prochaine session :</b> Entrée sur demande</div>]
    Et je voudrais le texte en rose uniquement

    Merci !

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Christelle_B Voir le message
    je ne sais pas si cela peut aider davantage, voici le code complet :
    Tu ne sais pas si offrir aux intervenants la possibilité de recopier le code pour le tester chez eux ça peut aider??? Tu devrais te balader sur le forum voir comment les autres font quand ils veulent exposer leur problème...

    Donc ça sert par exemple à voir que "prochaine_session" est un bs4.element.Tag (print(type(prochaine_session)) ce qui permet ensuite, sans même connaitre BeautifulSoup (mais connaissant tout de même Python ce qui est la raison pour laquelle tu es venue ici) de regarder ce qu'un elementTag a à offrir (print(dir(prochaine_session)) pour voir qu'il y a un attribut nommé "strings" qui semble de par son nom assez intéressant.
    De là l'intervenant tape print(prochaine_session.strings) et il voit que c'est un générateur. Ok tu ne sais pas ce qu'est un générateur mais un jour tu le sauras mais au-moins l'intervenant à qui tu montres ton code lui il le sait donc là il tape print(tuple(prochaine_session.strings)) et là il voit apparaitre ('Prochaine session :', ' Entrée sur demande') ce qui semble correspondre au besoin exposé.

    Accessoirement ça sert aussi à voir que certaines instructions sont peu utiles, telle info = [prochaine_session] (pourquoi en effet créer une liste avec un seul élément, liste qui ne sera ensuite jamais mise à jour... ) ce qui ne peut que t'améliorer dans ce langage.

    Voilà. tout ça c'est simplement parce que tu as eu la prévoyance de bien vouloir montrer ton code.

    Ensuite, l'intervenant te conseillera de tout de même aller lire la doc de BeautifulSoup car il sait de par son expérience que lire une doc, même si c'est rébarbatif, ça aide ensuite à trouver plus rapidement ses propres solutions à ses besoins.

    Et (dernier détail), un code se met entre balises [code] et [/code] pour qu'il ressorte comme code et non pas comme simple texte. C'est peut-être pas utile dans les autres langages mais en python où les tabulations sont primordiales, ça aide aussi un peu (et c'est écrit dans les règles).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 227
    Par défaut
    hello,
    à tester :
    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
    import requests
    from bs4 import BeautifulSoup
    from csv import writer
    #C2RP - financeur : Conseil Régional / Niveau : tous sauf 1 / Caractéristiques : Formations certifiantes
    url = "https://formations-en-hauts-de-france.c2rp.fr/recherche/resultats?size=20&type=FC&radius=100&financeurs=Conseil+R%C3%A9gional+Hauts-de-France%7CConseil%20R%C3%A9gional%20Hauts-de-France&niveaux=2%7C3%7C4%7C5%7C6%7C7%7C8%7C9%7C0&caracteristiques=FL_FOR_CER&query=&codePostal="
    page = requests.get(url)
    soup = BeautifulSoup(page.content, 'html.parser')
    listes = soup.find_all('article', class_="Formation")
    for liste in listes :
         prochaine_session = liste.find('div', class_='Formation-nextsession')
         villeHeures = liste.find(['div'], class_='Formation-details')
         if prochaine_session is not None:
             #print(prochaine_session.text)
             print(prochaine_session.text.replace('Prochaine session : ',''))
         if villeHeures is not None:
             print(villeHeures.text.strip())
         print('============================')
    Résultat partiel (début) :
    Entrée sur demande
    Calais






    Total : 200h
    ============================
    Entrée sur demande
    Albert






    Total : 840h
    dont
    280h entreprise
    ============================
    Les différents problèmes :
    1 - il n'y a pas les titres des formations -> tu n'as pas demandé de les extraire
    2 - il faut "nettoyer" la partie villeHeures
    3 - Avec les paramètres de ta requête (size=20) tu n'as que 20 résultats par page donc il y plus d'une centaine de pages. Tu peux essayer de mettre size=3000 pour avoir tous les résultats sur une seule page mais pas sûr que cela passe.

    Ami calmant, J.P

  6. #6
    Membre régulier
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Février 2018
    Messages : 9
    Par défaut
    Grand merci à tous les deux.

    J'en suis là de mes résultats :

    Titre professionnel agent(e) de montage et de câblage en électronique
    AKXIA Villeneuve d'Ascq
    1  session disponible
    Entrée sur demande
    Saint-Quentin
    
    
    
            Total : 735h
                      dont
              210h entreprise
    Il me faut maintenant trouver comment faire la boucle sur l'ensemble des pages de résultat (pour l'instant je n'ai le résultat que de la première page).

Discussions similaires

  1. Récupérer des valeurs entre balises dans textView
    Par jeremyvb11 dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 07/11/2017, 12h05
  2. Récupérer valeurs entre balises
    Par jeremyvb11 dans le forum Android
    Réponses: 0
    Dernier message: 03/11/2017, 23h03
  3. [RegEx] valeurs entre balises
    Par neptunes13 dans le forum Langage
    Réponses: 1
    Dernier message: 06/02/2012, 17h14
  4. [RegEx] Extraire un texte entres balises html ?
    Par booraq dans le forum Langage
    Réponses: 2
    Dernier message: 01/07/2007, 15h56
  5. [debutant] extraire phrase entre balises
    Par debdev dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 13/06/2005, 13h00

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