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

Moteurs Web Discussion :

Récupérer le texte d'une page web avec QWebEnginePage


Sujet :

Moteurs Web

  1. #1
    Membre régulier
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 113
    Points
    113
    Par défaut Récupérer le texte d'une page web avec QWebEnginePage
    Bonjour,

    Travaillant avec Qt 12.6, je souhaite ouvrir une page web et convertir son contenu en texte brut (plain text); le code actuel est le suivant :

    En-tête :
    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
     
    class Serveur : public QObject
    {
        Q_OBJECT
     
        QWebEngineView *view;
     
    public:
        Serveur() {}
        ~Serveur(){}
     
        void Telecharger_page_web(QUrl const&);
     
    protected slots:
        void Handle_html(QString const&);
     
    signals:
        void Go_html(QString const&);
     
    };
    et l'implémentation :

    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
    void Serveur::Telecharger_page_web(const QUrl & url)
    {
        QNetworkAccessManager *manager = new QNetworkAccessManager;
    
        QNetworkReply *reply = manager->get(QNetworkRequest(url));
    
        QEventLoop loop;
        connect(manager, &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);
        loop.exec();
    
        view = new QWebEngineView();
        view->load(reply->url());
        view->show();
    
        QWebEnginePage *page = new QWebEnginePage(view->page());
        page->toPlainText([this](const QString& result) mutable {emit Go_html(result);});
        connect(this, SIGNAL(Go_html(QString const&)), this, SLOT(Handle_html(QString const&)));
    
        delete reply;
    }
    
    void Serveur::Handle_html(QString const& text)
    {
          qDebug()<< "mon texte : "<< text;
    
    }
    Récupérer la page web avec QWebEngineView ne pose pas de problème (view->show() affiche le contenu de la requête dans une fenêtre), mais l'étape d'après, la conversion en texte brut, ne me retourne qu'une chaîne vide (qDebug() << text)...

    La documentation n'est pas très disert sur le sujet et je n'ai rient trouvé de convaincant sur les forums. Du coup je bloque... toute idée est la bienvenue.

    Bonne journée

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Pour commencer, s'il s'agit de simplement télécharger le contenu « brut html » d'une page Web (ce que laisserait à penser le nom Handle_html), la partie QNetworkAccessManager + QNetworkReply se suffit à elle-même. Une fois le signal finished() reçu, il te suffit de faire un reply->readAll() pour obtenir le contenu téléchargé.
    Note qu'il vaut mieux éviter de rendre l'appel synchrone avec QEventLoop.

    Dans le cas contraire elle ne sert strictement à rien, et tu peux remplacer view->load(reply->url()); par view->load(url);.
    Et s'il s'agit donc de récupérer le texte… dans le code qui suit, tu as plusieurs problèmes :
    • QWebEnginePage *page = new QWebEnginePage(view->page()); ne récupère pas la page de la view, mais en crée une autre indépendante, qui est juste enfant de la page que tu cibles ;
    • tu dois attendre que le chargement de la page (view->load(url);) soit terminé (signal loadFinished(bool)) avant de vouloir récupérer son contenu ;
    • chaque fois que tu vas appeler la fonction membre Telecharger_page_web(), tu vas allouer un nouveau view = new QWebEngineView(); et tu auras une fuite mémoire.


    Enfin, en l'état ton signal Go_html() est quelque peu inutile : tu pourrais très bien remplacer emit Go_html(result); par Handle_html(result);.

    Ce qui donnerait au final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        connect(view, &QWebEngineView::loadFinished, [this](bool ok) {
            if (!ok) {
                // Une erreur est survenue
            } else {
                view->page()->toPlainText([this](const QString & result) {
                    Handle_html(result);
                });
            }
        });
     
        view->load(url); // mieux vaut effectuer la connexion avant
    Dernière modification par Invité ; 14/03/2020 à 18h50.

  3. #3
    Membre régulier
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 113
    Points
    113
    Par défaut
    Merci, ça fonctionne nickel ! on peut même passer directement par QWebEnginePage... Une petite synthèse du code :

    .h
    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
     
    class Serveur : public QObject
    {
        Q_OBJECT
     
        QWebEnginePage *page;
     
    public:
        Serveur();
        ~Serveur(){}
     
        void Telecharger_page_web(QUrl const&);
     
    protected slots:
        void Manipulation_text(QString const&);
     
    };
    .cpp
    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
     
    #include "reseau.h"
     
    Serveur::Serveur()
    {
        page = nullptr;
    }
     
    void Serveur::Telecharger_page_web(const QUrl & url)
    {
        page = new QWebEnginePage;
     
        connect(page, &QWebEnginePage::loadFinished, [this](bool ok)
                {
                        if (!ok)
                            qDebug() << "Une erreur est survenue";
                        else
                            page->toPlainText([this](QString const& result) {Manipulation_text(result);});
     
                });
     
        page->load(url);
    }
     
    void Serveur::Manipulation_text(QString const& texte)
    {
        qDebug() << "Texte : "<< texte;
     
        delete page;
    }
    Néanmoins, juste une petite question : la conversion en html page->toHtml(...) renvoie une chaîne vide, alors que la définition de la fonction est identique à plaintext ??

    Bonne soirée

  4. #4
    Invité
    Invité(e)
    Par défaut
    Exactement identique ? Ou n’essaierais-tu pas de récupérer la réponse de façon plus ou moins synchrone ?
    Il est possible que ce soit un bogue de Qt, je vois ce ticket qui a été ouvert.

  5. #5
    Membre régulier
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 113
    Points
    113
    Par défaut
    void QWebEnginePage::toHtml(const QWebEngineCallback<const QString &> &resultCallback) const

    void QWebEnginePage::toPlainText(const QWebEngineCallback<const QString &> &resultCallback) const


    C'est tout pareil, et les 2 sont asynchrones... ça doit être effectivement un bug.

Discussions similaires

  1. Récupérer des infos d'une page Web avec identifiant et mdp en VBA
    Par sebfch dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/01/2017, 07h48
  2. Réponses: 5
    Dernier message: 22/01/2014, 09h14
  3. Récupérer les metas d'une page web avec un bookmarklet en javascript
    Par cocobelle89 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 25/06/2013, 14h09
  4. Récupérer seulement le texte d'une page Web
    Par amelia dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 20/02/2010, 23h13
  5. Récupérer le texte d'une page web
    Par claustro dans le forum Langage
    Réponses: 2
    Dernier message: 29/09/2008, 13h18

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