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

Réseau/Web Python Discussion :

Extraction web BeautifulSoup


Sujet :

Réseau/Web Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2023
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Extraction web BeautifulSoup
    Bonjour,

    Je débute en programmation, et j'essaye d'appliquer des exercices de scrapping.

    Je dois extraire les prix de ce site :
    https://www.annexx.com/box-garde-meuble/paris/igny.php

    Voici mon 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    import csv
    from bs4 import BeautifulSoup
    import requests
     
    url = "https://www.annexx.com/box-garde-meuble/paris/igny.php"
    page = requests.get(url)
    site = BeautifulSoup(page.content, "html.parser")
     
    tailles = site.find_all("p", class_="surface")
    liste_des_tailles = []
    for taille in tailles:
        liste_des_tailles.append(taille.string)
     
     
    promo = site.find_all("div", class_="alert-message hidden-xs hidden-sm offer")
    liste_des_promos = []
     
    for promos in promo:
        liste_des_promos.append(promos.text)
     
    prix = site.find_all("span", class_="stroprix = site.find_all("span", class_="strong")ng")
     
    liste_des_prix = []
     
    for prixx in prix:
        liste_des_prix.append(prixx.text)
     
    en_tete = ["Taille", "Promo", "Prix"]
     
    with open("prix_annexx.csv", "w") as csv_psg:
        writer = csv.writer(csv_psg, delimiter=",")
        writer.writerow(en_tete)
     
        for titre_csv, categorie_csv, date_csv in zip(liste_des_tailles, liste_des_promos, liste_des_prix):
            ligne = [titre_csv.string, categorie_csv, date_csv]
            writer.writerow(ligne)
    Ce que je n'arrive pas avec BeautifulSoup, c'est extraire le prix. En effet, le prix est dans cette balise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <span class="small-text">
    <span class="text_before_price">
    le 2
    <sup>e</sup>
     et 3
    <sup>e</sup> 
    mois.
    </span>
    <strong>84€</strong>
     les autres mois                                        
    </span>
    Pouvez vous m'éclaircir sur le code a utiliser pour extraire la balise strong ?

    Merci et bonne journée !

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    Hello,
    es-tu sur que BeautifulSoup soit le bon programme pour tes extractions. Comment fais-tu pour choisir le filtre de Box à utiliser ? Si tu veux pouvoir filtrer suivant la taille du Box et extraire les infos des Box qui sont affichés à l'écran selenium est une meilleure solution. Et dans le cas présent même avec Selenium cela risque d'être difficile car il y a du flex utilisé dans la page. Avec le code que tu proposes on travaille un peu en aveugle et si il faut une correspondance d'élément entre taille , promo et prix cela semble compromis.
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 105
    Points : 4 455
    Points
    4 455
    Par défaut
    bonjour
    Citation Envoyé par Sanito Voir le message
    Je débute en programmation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    prix = site.find_all("span", class_="stroprix = site.find_all("span", class_="strong")ng")
    Ce que je n'arrive pas avec BeautifulSoup, c'est extraire le prix
    Débute ou n'a aucune notions ?
    Ce code n'a aucun sens, je soupçonne un copié/collé au hasard Un minimum est de lire la doc de ta librairie (on peut avoir 5 ans de python mais débutant avec une librairie ! dans ce cas, on lit toujours la doc)

    Ta recherche par colonne n'a rien de logique
    Il est possible de rechercher une ligne du tableau , puis on recherche dans la ligne chaque élément qui nous convient.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    resultats = []
    for ligne in soup.select('div.box-choices-container div.box-choice.medium-size'):
        print('surface:', ligne.select_one('p.surface').get_text().removesuffix('m²'), end='\t')
        print('prix:', ligne.select_one('span strong').get_text().remove_suffix('€'), end='`t')
        dispo = ligne.select_one('p.availability')
        if dispo: print('Disponible', end='')
        print()
        resultats.append((a,b,c))


    ps: comme jurassic pork, tu as sans doute besoin de plus que cette simple page ... sinon tu as toutes les url déjà dans une bd et cette lib est plus que suffisante.
    $moi= ( !== ) ? : ;

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    Voici un script python qui utilise selenium qui charge la page dans chrome, filtre les box sur toutes les tailles et affiche la taille, la promo, le prix des box affichés :
    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
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    ser = Service(r"D:\\Selenium\\WebDrivers\\chromedriver.exe")
    options = webdriver.ChromeOptions() 
    options.add_argument("user-data-dir=D:\\Selenium\\Profil") #Path to your chrome profile
    w = webdriver.Chrome(service=ser, options=options)
    url1 = "https://www.annexx.com/box-garde-meuble/paris/igny.php"
    w.implicitly_wait(5) # seconds
    w.get(url1)
    w.find_element(By.CLASS_NAME, 'all-size-filter').click()
    container = w.find_element(By.CLASS_NAME, 'box-choices-container')
    boxes = container.find_elements(By.CLASS_NAME,'box-choice')
    for box in boxes:
        print(box.find_element(By.CLASS_NAME,'size').text)
        print(box.find_element(By.CLASS_NAME,'alert-message').get_attribute("innerHTML"))
        print(box.find_element(By.CLASS_NAME,'prices-container').text)
        print("======================")
    le haut de la page affichée :
    Nom : annexx.png
Affichages : 228
Taille : 108,6 Ko

    le début des résultats :
    3 m²
    2 mois à <span>-50%</span>
    TARIF WEB
    38,5€ /mois
    le 2e et 3e mois.
    77€ les autres mois
    ======================
    3.5 m²
    2 mois à <span>-50%</span>
    TARIF WEB
    41,5€ /mois
    le 2e et 3e mois.
    83€ les autres mois
    ======================
    4 m²
    2 mois à <span>-50%</span>
    TARIF WEB
    46€ /mois
    le 2e et 3e mois.
    92€ les autres mois
    ======================
    A noter que si pour "l'alerte-message" je met text au lieu de get_attribute("innerHTML") une ligne vide s'affiche. Si quelqu'un sait d'où vient le problème.
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    Hello,
    Citation Envoyé par jurassic pork Voir le message
    A noter que si pour "l'alerte-message" je met text au lieu de get_attribute("innerHTML") une ligne vide s'affiche. Si quelqu'un sait d'où vient le problème.
    cela fonctionne avec textContent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        print(box.find_element(By.CLASS_NAME,'alert-message').get_attribute("textContent"))
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2023
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Merci !
    Merci beaucoup pour ton aide @jurrassic Park !!!!

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

Discussions similaires

  1. [XL-2010] Gestion de Film (Extraction Web, DataBase , Fiche Film , Recherche dans DB) v2
    Par mjpmjp dans le forum Macros et VBA Excel
    Réponses: 28
    Dernier message: 13/09/2018, 20h21
  2. Réponses: 28
    Dernier message: 19/03/2018, 22h18
  3. Extraction web service
    Par Romalafrite dans le forum Pentaho
    Réponses: 1
    Dernier message: 08/03/2010, 19h16
  4. Extraction de texte de pages web?
    Par VinnieMc dans le forum Web
    Réponses: 4
    Dernier message: 01/03/2006, 19h42

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