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 :

Récupérer la valeur d'une variable stockée dans un js script et l'utiliser sur python


Sujet :

Python

  1. #21
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Février 2023
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Février 2023
    Messages : 49
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Hello,
    voici un exemple en python qui récupère la valeur d'une variable javascript présente dans la page html suivante (testjs.html):
    Code Html : 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
    <!DOCTYPE html>
    <html>
    <head></head>
    <body>
    <h1>Demo: Current Date</h1>
    <p id="p1"></p>
    <script>
    var AvailableDates = [
        "2023-03-01",
        "2023-03-02",
        "2023-03-06",
        "2023-03-07"
    ];
            var date = new Date();
            document.getElementById("p1").innerHTML = date;
    </script>
    </body>
    </html>

    code python :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.by import By
    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, chrome_options=options)
    url1 = "file:///D:/Dev/test/testjs.html"
    w.implicitly_wait(5) # seconds
    w.get(url1)
    DatesValides = w.execute_script("return AvailableDates;")
    print(DatesValides)
    Ami calmant, J.P
    merci beaucoup pour votre intervention.

  2. #22
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 688
    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 688
    Par défaut
    Citation Envoyé par Is El Voir le message
    merci beaucoup pour votre intervention.
    Ce n'est ni plus ni moins qu'une application du tuto indiqué dans cette réponse... que vous n'avez pas trouvé en cherchant (je ne sais quoi) sur Internet.

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

  3. #23
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Février 2023
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Février 2023
    Messages : 49
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Ce n'est ni plus ni moins qu'une application du tuto indiqué dans cette réponse... que vous n'avez pas trouvé en cherchant (je ne sais quoi) sur Internet.

    - W
    je l'ai essayé et ca a marché mais je n'ai pas su comment procéder si le script ne trouve pas de date disponibles. ( loop) merci.

  4. #24
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Février 2023
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Février 2023
    Messages : 49
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    En admettant que vous avez raison sur le format, si vous testez, vous verrez le résultat...

    Un code qui permet de récupérer une date pourrait être,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import re
     
    html = """<script type="text/javascript">
    var available_dates = ["20-02-2023"];
    </script>"""
     
     
    date_regex = re.compile(r'\d{2}-\d{2}-\d{4}') # recherche de la date sous forme dd-mm-yyyy
    match = date_regex.search(html)
    if match:
        date = match.group()
        print(date) # affichage de la date
    else:
        print("Aucune date trouvée dans la variable html.")
    la proposition de Fred1599 a marché mais seulement parce que la variable est déjà présente dans le script python

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    html = """<script type="text/javascript">
    var available_dates = ["20-02-2023"];
    </script>"""
    Or le contenu de available_dates qui est dans le javascript est variable . je pense que je devrais localiser le script par xpath comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    script = driver.find_elements(By.XPATH, "//script[@type='text/javascript']")
    et puis après trouver la variable available_dates (chose que je n'ai pas su faire) et par la suite exécuter le code de Fed1599. merci

  5. #25
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Février 2023
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Février 2023
    Messages : 49
    Par défaut
    Citation Envoyé par umfred Voir le message
    Si le script est lisible dans le html de la page, tu pourrais localiser la chaine en lisant le code de la page comme du simple texte, et chercher dedans ta chaine qui t'intéresse.
    (chercher aussi dans la doc de selenium, si il n'y a pas mieux)
    da l'aide svp

  6. #26
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Février 2023
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Février 2023
    Messages : 49
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    En admettant que vous avez raison sur le format, si vous testez, vous verrez le résultat...

    Un code qui permet de récupérer une date pourrait être,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import re
     
    html = """<script type="text/javascript">
    var available_dates = ["20-02-2023"];
    </script>"""
     
     
    date_regex = re.compile(r'\d{2}-\d{2}-\d{4}') # recherche de la date sous forme dd-mm-yyyy
    match = date_regex.search(html)
    if match:
        date = match.group()
        print(date) # affichage de la date
    else:
        print("Aucune date trouvée dans la variable html.")
    j'ai essayé ca mais il me donne une date qui fait partie de la variable blocked_days. je suis plutôt intéressé par available_dates.merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    script = driver.find_elements(By.XPATH, "//script[@type='text/javascript']")
    date_regex = re.compile(r'\d{2}-\d{2}-\d{4}')
    match = date_regex.search(script)
    if match:
        date = match.group()
        print(date)
    else:
        print("Aucune date trouvée dans la variable html.")

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 190
    Par défaut
    Si la variable est initialisée ou mise à jour par l'exécution du script, il ne faut pas utiliser le html source mais il faut exécuter du javascript pour retourner la valeur de la variable.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maVariablePython = webdriver.execute_script("return laVariable;")

  8. #28
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 510
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 510
    Par défaut
    il faut aussi qu'elle soit accessible (portée) pour qu'elle puisse être retournée

  9. #29
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Février 2023
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Février 2023
    Messages : 49
    Par défaut
    Citation Envoyé par umfred Voir le message
    il faut aussi qu'elle soit accessible (portée) pour qu'elle puisse être retournée
    Comment saurai-je si elle est accessible ou pas?

  10. #30
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Février 2023
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Février 2023
    Messages : 49
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Si la variable est initialisée ou mise à jour par l'exécution du script, il ne faut pas utiliser le html source mais il faut exécuter du javascript pour retourner la valeur de la variable.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maVariablePython = webdriver.execute_script("return laVariable;")
    donc je laisse tomber les regex et je procède comme ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    script = driver.find_elements(By.XPATH, "//script[@type='text/javascript']")
    dates = driver.execute_script("return available_dates;")
    while dates : 
        for date in dates :
            Select(date)
        else :
            print("no available date")
        break
    prière de me corriger si nécessaire

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 190
    Par défaut
    le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    script = driver.find_elements(By.XPATH, "//script[@type='text/javascript']")
    ne sert à rien.
    Il faut seulement avoir lu la page HTML par le navigateur commandé par sélénium pour que les scripts qui se trouvent dans la page HTML aient été exécutés. Le souci c'est que ta variable available_dates sera cachée du contexte global car elle est à l'intérieur de $(document).ready()

  12. #32
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Février 2023
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Février 2023
    Messages : 49
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    script = driver.find_elements(By.XPATH, "//script[@type='text/javascript']")
    ne sert à rien.
    Il faut seulement avoir lu la page HTML par le navigateur commandé par sélénium pour que les scripts qui se trouvent dans la page HTML aient été exécutés. Le souci c'est que ta variable available_dates sera cachée du contexte global car elle est à l'intérieur de $(document).ready()
    d'accord j'enlève le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    script = driver.find_elements(By.XPATH, "//script[@type='text/javascript']")
    puisqu'il ne sert à rien . donc la variable est inaccessible de l'extérieur alors le seul moyen c'est d'extraire ses données avec regex n'est ce pas?

  13. #33
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Février 2023
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Février 2023
    Messages : 49
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    script = driver.find_elements(By.XPATH, "//script[@type='text/javascript']")
    ne sert à rien.
    Il faut seulement avoir lu la page HTML par le navigateur commandé par sélénium pour que les scripts qui se trouvent dans la page HTML aient été exécutés. Le souci c'est que ta variable available_dates sera cachée du contexte global car elle est à l'intérieur de $(document).ready()
    j'ai trouvé ce code en js mais j'ai pas su le traduire en py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    let regexp = /var available_dates = \[([^\]]*)\]/;
    // parenthèses capturantes :...........^.....^
    let match = script.textContent.match(regexp);
    if (match) {
      let dateList = match[1];
      let dateRegexp = /(\d{2})-(\d{2})-(\d{4})/g;
      let dateMatch;
      while (dateMatch = dateRegexp.exec(dateList)) {
        console.log(dateMatch);
        ...
      }
    }

  14. #34
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 510
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 510
    Par défaut
    la regex pas obligatoire mais peut être utilisée pour récupérer juste la portion du code source correspondant au script (si tu récupères la ligne ou apparait la variable). Ensuite, traitement de la chaine comme on l'a évoqué Fred1599 et moi.
    Dans le code de fred1599, la variable html sera pour toi le code source de la page web récupéré via selenium (ou juste le code de script)

  15. #35
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Février 2023
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Février 2023
    Messages : 49
    Par défaut
    Citation Envoyé par umfred Voir le message
    la regex pas obligatoire mais peut être utilisée pour récupérer juste la portion du code source correspondant au script (si tu récupères la ligne ou apparait la variable). Ensuite, traitement de la chaine comme on l'a évoqué Fred1599 et moi.
    Dans le code de fred1599, la variable html sera pour toi le code source de la page web récupéré via selenium (ou juste le code de script)
    J'ai rien compris désolé

  16. #36
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Février 2023
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Février 2023
    Messages : 49
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Ce n'est ni plus ni moins qu'une application du tuto indiqué dans cette réponse... que vous n'avez pas trouvé en cherchant (je ne sais quoi) sur Internet.

    - W
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    driver.execute_script("return availables_dates;")
    ne marche pas parce que la variable
    available_dates
    fait partie de
    $(document).ready()
    donc elle est inaccessible de l'extérieur .

  17. #37
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 688
    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 688
    Par défaut
    Citation Envoyé par Is El Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    driver.execute_script("return availables_dates;")
    ne marche pas parce que la variable fait partie de donc elle est inaccessible de l'extérieur.
    C'est ce que je vous ai déjà dit (pour d'autres raisons): vous ne m'apprenez rien.
    Mais ce code fait ce que vous avez demandé: récupérer une variable dans le javascript de la page HTML.
    Après çà ne résout pas votre problème, "normal" car ne sachant pas programmer, vous ne savez pas si vos idées sont pertinentes. Et tant que personne ira se connecter à ce site Web à votre place pour imaginer comment en tirer quelque chose et/ou valider vos idées...

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

  18. #38
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Février 2023
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Février 2023
    Messages : 49
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    C'est ce que je vous ai déjà dit (pour d'autres raisons): vous ne m'apprenez rien.
    Mais ce code fait ce que vous avez demandé: récupérer une variable dans le javascript de la page HTML.
    Après çà ne résout pas votre problème, "normal" car ne sachant pas programmer, vous ne savez pas si vos idées sont pertinentes. Et tant que personne ira se connecter à ce site Web à votre place pour imaginer comment en tirer quelque chose et/ou valider vos idées...

    - W
    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
    import re
     
    html = """
    <script type="text/javascript">
    var dt4  = '2019-03-07';
    var blocked_dates = ["20-03-2019","01-01-1970","28-03-2019","29-03-2019","20-03-2019","01-01-1970","28-03-2019","29-03-2019"];
    var available_dates = ["07-03-2019","08-03-2019","11-03-2019","12-03-2019","13-03-2019","14-03-2019","15-03-2019","18-03-2019","19-03-2019","21-03-2019","22-03-2019","25-03-2019","26-03-2019","27-03-2019"];
    var fullCapicity_dates = [];
    var offDates_dates = ["09-03-2019","10-03-2019","16-03-2019","17-03-2019","20-03-2019","23-03-2019","24-03-2019","28-03-2019","29-03-2019","30-03-2019","31-03-2019"];
    var allowArray = [1];
    </script>
    """
     
    date_regex = re.compile(r'var available_dates = \[[^\]]*\]') # recherche de la date sous forme dd-mm-yyyy
    match = date_regex.search(html)
    if match:
        date = match.group()
        print(date) # affichage de la date
    else:
        print("Aucune date trouvée dans la variable html.")
    output :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var available_dates = ["07-03-2019","08-03-2019","11-03-2019","12-03-2019","13-03-2019","14-03-2019","15-03-2019","18-03-2019","19-03-2019","21-03-2019","22-03-2019","25-03-2019","26-03-2019","27-03-2019"]
    Pensez vous que si je change html par le script localisé via xpath
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    script = driver.find_elements(By.XPATH, "//script[@type='text/javascript']")
    , le code marchera-t-il?

  19. #39
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 688
    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 688
    Par défaut
    Citation Envoyé par Is El Voir le message
    Pensez vous que si je change html par le script localisé via xpath
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    script = driver.find_elements(By.XPATH, "//script[@type='text/javascript']")
    , le code marchera-t-il?
    Ça fonctionnera probablement (sans planter côté Python) mais est ce que çà produira le résultat attendu (par vous)?
    Si vous ne savez pas répondre à cette question, vous essayez une idée sans trop comprendre les raisons pour lesquelles ça pourrait fonctionner.
    Et si çà ne marche pas, comment savoir si la méthode utilisée n'est juste pas applicable ici ou si elle a été mal codée?

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

  20. #40
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Février 2023
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Maroc

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Février 2023
    Messages : 49
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Ça fonctionnera probablement (sans planter côté Python) mais est ce que çà produira le résultat attendu (par vous)?
    Si vous ne savez pas répondre à cette question, vous essayez une idée sans trop comprendre les raisons pour lesquelles ça pourrait fonctionner.
    Et si çà ne marche pas, comment savoir si la méthode utilisée n'est juste pas applicable ici ou si elle a été mal codée?

    - W
    le but escompté est de sélectionner une date parmi celles capturées et continuer le remplissage du formulaire.

Discussions similaires

  1. Réponses: 17
    Dernier message: 11/10/2012, 18h27
  2. [Spip] Récupérer la valeur d'une variable PHP dans une boucle Spip
    Par papisdoums dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 10/04/2009, 19h03
  3. [PHP 5.0] Récupérer la valeur d'une variable php dans du code javascript
    Par HF974 dans le forum Langage
    Réponses: 4
    Dernier message: 08/03/2009, 11h46
  4. Réponses: 2
    Dernier message: 03/12/2008, 17h34
  5. Réponses: 3
    Dernier message: 28/08/2007, 15h21

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