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

VB.NET Discussion :

Récupérer une info sur code source HTML


Sujet :

VB.NET

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    799
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 799
    Points : 225
    Points
    225
    Par défaut Récupérer une info sur code source HTML
    Bonjour à tous,
    J'aurai besoin de récupérer une info sur un code source html à partir d'un formulaire en vb.net.
    J'ai utilisé pour l'exemple le site"https://24timezones.com/Paris/heure" pour avoir l'heure de Paris.
    Le problème que j'ai est que je n'arrive pas à récupérer l'heure sur le code html.Quand j'inspecte avec FireFox l'élément voulu j'ai :

    Nom : Capture d'écran 2024-07-08 100343.png
Affichages : 91
Taille : 13,6 Ko

    Mais quand j'essaie de le localiser avec du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim NouveauData1 = Data.Substring(Data.IndexOf("<span id=" & """currentTime""" & ">") + 10)
    Dim NouveauData2 = NouveauData1.Substring(0, 20)
    TextBox9.Text = NouveauData2
    j'ai :

    currentTime">--:--</

    Le code source sans l'info voulu, en fait pour être clair quand j'inspecte la date j'ai la réponse et quand je recherche dans le code source la date je ne l'ai pas.Si quelqu'un a une idée. MERCI

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 730
    Points : 5 391
    Points
    5 391
    Par défaut
    Pourquoi te compliquer la vie à décortiquer une page web lorsqu'il existe des API pour cela.
    Celle-ci par exemple : https://timezonedb.com/api
    Ou encore celle-ci : https://worldtimeapi.org/pages/examples

    Exemple pour l'heure de Paris avec WorldTimeApi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl --location 'http://worldtimeapi.org/api/timezone/Europe/Paris'
    Retour :
    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
    {
        "abbreviation": "CEST",
        "client_ip": "77.130.71.132",
        "datetime": "2024-07-08T10:37:14.549845+02:00",
        "day_of_week": 1,
        "day_of_year": 190,
        "dst": true,
        "dst_from": "2024-03-31T01:00:00+00:00",
        "dst_offset": 3600,
        "dst_until": "2024-10-27T01:00:00+00:00",
        "raw_offset": 3600,
        "timezone": "Europe/Paris",
        "unixtime": 1720427834,
        "utc_datetime": "2024-07-08T08:37:14.549845+00:00",
        "utc_offset": "+02:00",
        "week_number": 28
    }
    Edit :
    Prend le temps de lire les conditions d'utilisation :
    Sur la première, il faut s'enregistrer.
    Sur la deuxième, tu ne peux pas l'utiliser à des fin commerciales.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 265
    Points : 1 843
    Points
    1 843
    Par défaut
    Je me demande si dans ton cas, tu ne traites pas l'information trop tôt (ce que tu obtiens pourrais être le texte affiché au chargement de la page, avant actualisation de l'heure)

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    799
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 799
    Points : 225
    Points
    225
    Par défaut
    Citation Envoyé par umfred Voir le message
    Je me demande si dans ton cas, tu ne traites pas l'information trop tôt (ce que tu obtiens pourrais être le texte affiché au chargement de la page, avant actualisation de l'heure)
    *************************
    Merci pour info j'ai écris comme cela pour afficher la page web :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Private Async Sub VID81_82Click(sender As Object, e As EventArgs) Handles VID81_82.Click
        Dim client = New HttpClient
        Dim valTimeOut = TimeSpan.FromSeconds(10)
        client.Timeout = valTimeOut
        Dim rep = New HttpResponseMessage
        rep = Await client.GetAsync("https://24timezones.com/Paris/heure")
        Dim read = Await rep.Content.ReadAsStringAsync
        TextBox8.Text = read
        Dim Data = read
        Dim NouveauData1 = Data.Substring(Data.IndexOf("<span id=" & """currentTime""" & ">") + 10)
        Dim NouveauData2 = NouveauData1.Substring(0, 20)
        TextBox9.Text = NouveauData2

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 265
    Points : 1 843
    Points
    1 843
    Par défaut
    Si tu regardes ce que tu récupères, tu verras alors que c'est normal d'avoir ce résultat là.
    L'heure est générée par du code javascript qui remplit le innerHTML de currentTime via la fonction calculateTimeToUse

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    799
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 799
    Points : 225
    Points
    225
    Par défaut
    Citation Envoyé par umfred Voir le message
    Si tu regardes ce que tu récupères, tu verras alors que c'est normal d'avoir ce résultat là.
    L'heure est générée par du code javascript qui remplit le innerHTML de currentTime via la fonction calculateTimeToUse
    **************************************
    Merci pour ta réponse, je vais pas me lancer dans des cours pour l'instant HTML/JavaScript...je comprends bien ce que tu m'informe j'ai trouvé une autre solution en utilisant la propriété Date de la classe HttpResponseMessage, mais même si ça marche, bien que j'ai l'heure avec deux heures de moins... j'arrive pas à voir comment faire pour renvoyer des infos HTML de l'Inspecteur d'élément de Firefox car là j'ai la donnée en clair. Si tu as des infos. MERCI
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim read = rep.Headers.Date

  7. #7
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 730
    Points : 5 391
    Points
    5 391
    Par défaut
    La date dans Headers.Date correspond à l'heure du serveur qui héberge le site que tu appelles.
    Cela n'a rien à voir avec l'heure que tu demandes.

    Fait l'essai en demandant l'heure de NewYork : https://24timezones.com/New-York/time et tu verras que tu obtiendra également l''heure de Paris avec 2h de décalage dans ce header.
    Il s'agit de l'heure de Greenwich (GMT pour Greenwich Mean Time).

    La date GMT peut-être obtenu simplement avec DateTime.UtcNow.

    Toutefois, je pense toujours qu'il vaut mieux appeler une API (car le contrat ne change pas) ou la calculer à partir de GMT au lieu de tenter de lire une page HTML dont le contenu pourrait changer.

  8. #8
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 730
    Points : 5 391
    Points
    5 391
    Par défaut
    Quand je disais qu'on pouvais la calculer à partir de GMT.
    Il y a tout ce qu'il faut en standard.

    Par exemple :
    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
    Imports System
     
    Module Program
        Sub Main(args As String())
            Console.WriteLine("Hello World!")
     
            Dim utc As DateTime = DateTime.UtcNow
     
            Dim zones As IEnumerable(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones()
            For Each zone As TimeZoneInfo In zones
                Console.WriteLine($"Id: {zone.Id}")
                Console.WriteLine($"DisplayName: {zone.DisplayName}")
                Console.WriteLine($"StandardName: {zone.StandardName}")
                Console.WriteLine($"BaseUtcOffset: {zone.BaseUtcOffset}")
     
                Dim rule = zone.GetAdjustmentRules().FirstOrDefault()
                If (rule IsNot Nothing) Then
                    Console.WriteLine($"Delta: {rule.DaylightDelta}")
                    Dim local As DateTime = utc.Add(zone.BaseUtcOffset).Add(rule.DaylightDelta)
                    Console.WriteLine($"Local Time: {local}")
                End If
     
                Console.WriteLine()
            Next
     
        End Sub
    End Module
    Parmi toutes les plages horaires affichées, on retrouve bien celle de Paris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Id: Romance Standard Time
    DisplayName: (UTC+01:00) Bruxelles, Copenhague, Madrid, Paris
    StandardName: Paris, Madrid
    BaseUtcOffset: 01:00:00
    Delta: 01:00:00
    Local Time: 09/07/2024 16:54:44
    Edit :
    Il restera toutefois à déterminer s'il faut appliquer ou non l'heure d'été.
    Tout est dans la doc :
    https://learn.microsoft.com/en-us/do...o?view=net-8.0
    https://learn.microsoft.com/en-us/do...e?view=net-8.0
    https://learn.microsoft.com/en-us/do...e?view=net-8.0

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 265
    Points : 1 843
    Points
    1 843
    Par défaut
    Après si tu veux absolument le récupérer sur la page web, il faut l'ouvrir dans un webview2 (https://learn.microsoft.com/fr-fr/mi...edge/webview2/), une fenêtre navigateur pour que le javascript soit exécuté, et alors tu pourra faire ta récupération.

    Mais si c'est juste pour récupérer une heure d'un fuseau horaire, autant utiliser les fonctions internes du framework comme popo le montre.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    799
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 799
    Points : 225
    Points
    225
    Par défaut
    MErci à vous pour toutes vos réponses !
    Du coup j'ai le choix entre deux solutions soit utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim date0 As Date = Date.Now
    soit la solutions de popo en testant si l'ID est égal "Romance Standard Time" :
    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
     
    Dim utc As DateTime = DateTime.UtcNow
     
    Dim zones As IEnumerable(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones()
    For Each zone As TimeZoneInfo In zones
        LocalOK = False
        Debug.Print($"Id: {zone.Id}")
        If zone.Id = "Romance Standard Time" Then
            LocalOK = True
        End If
        Debug.Print($"DisplayName: {zone.DisplayName}")
        Debug.Print($"StandardName: {zone.StandardName}")
        Debug.Print($"BaseUtcOffset: {zone.BaseUtcOffset}")
     
        Dim rule = zone.GetAdjustmentRules().FirstOrDefault()
        If (rule IsNot Nothing) Then
            Debug.Print($"Delta: {rule.DaylightDelta}")
            Dim local As DateTime = utc.Add(zone.BaseUtcOffset).Add(rule.DaylightDelta)
            Debug.Print($"Local Time: {local}")
            If LocalOK Then
                dateOK = local
            End If
        End If
     
        Debug.Print("")
    Next
    TextBox11.Text = dateOK
    Le résultat est le même :
    10/07/2024 11:37:02

    Pour ce que me dit umfred sur webview2 il fonctionne avec Microsoft Edge et j'utilise Firefox
    Comme je l'ai déjà dit, j'aurai voulu récupérer les infos directement sur le code source comme le permet l'Inspecteur de Firefox mais apparemment ce n'est pas possible.
    Si vous avez des remarques n'hésitez pas
    Merci encore
    A+

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 265
    Points : 1 843
    Points
    1 843
    Par défaut
    le Now va donner l'heure (locale) de la machine sur laquelle est exécuté ton code
    Si la machine est réglé sur le fuseau horaire de New York, ça te donnera l'heure de New York.
    (après il y des méthodes de conversion)

    Pour revenir au scraping (prise d'info sur une page web), tu peux aussi utiliser selenium par exemple et lui faire utiliser le moteur de navigation que tu veux (Edge,Chrome,Firefox) https://www.selenium.dev/documentation/

    Mais à partir du moment où une API existe, c'est toujours mieux de l'utiliser, c'est plus rapide et sécurisé en général.

  12. #12
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 730
    Points : 5 391
    Points
    5 391
    Par défaut
    Citation Envoyé par xeron33 Voir le message
    soit la solutions de popo en testant si l'ID est égal "Romance Standard Time"
    Il s'agissait d'un code montrant un éventail de possibilités offertes par le Framework.
    Si ton but est uniquement d'obtenir l'heure du fuseau horaire de Paris, il y a plus simple.
    Encore faut-il prendre le temps de lire la doc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim paris As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Romance Standard Time")
    Dim parisTime As DateTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, paris)
     
    Console.WriteLine($"Paris Time: {parisTime}")

    Edit :
    Citation Envoyé par xeron33 Voir le message
    Comme je l'ai déjà dit, j'aurai voulu récupérer les infos directement sur le code source comme le permet l'Inspecteur de Firefox mais apparemment ce n'est pas possible.
    Si vous avez des remarques n'hésitez pas.
    J'ai effectivement une remarque :
    Vouloir absolument passer par cette page web est à mon avis une énorme bêtise.
    Déjà, tu ne peux pas être certain que le structure de cette page ne va pas changer avec le temps (je l'ai déjà mentionné).
    Ensuite, cela nécessite des ressources, du temps de traitement et parfois certain protocoles de sécurité (TLS) de traverser la couche réseau pour appeler une page web (ou une API).
    Si tu peux obtenir ce que tu veux avec le standard offert par VB.NET, c'est très présomptueux de penser que tu peux faire mieux que Microsoft.

Discussions similaires

  1. Réponses: 11
    Dernier message: 29/05/2011, 11h55
  2. Afficher le code source HTML d'une page
    Par piratack007 dans le forum Langage
    Réponses: 6
    Dernier message: 15/09/2009, 23h29
  3. Affichage de code source html dans une de mes pages
    Par tchern dans le forum Websphere
    Réponses: 2
    Dernier message: 06/03/2009, 15h47
  4. [WD12] Lire code source HTML d'une frame
    Par Wraack dans le forum WinDev
    Réponses: 3
    Dernier message: 26/01/2009, 23h50
  5. Faire un parsing "rapide" sur le code source html de www.break.com
    Par Inquirer94 dans le forum Général Java
    Réponses: 3
    Dernier message: 27/03/2007, 12h33

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