Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QtWebEngine
  4. How can I get data from Wikipedia?
Forum Updated to NodeBB v4.3 + New Features

How can I get data from Wikipedia?

Scheduled Pinned Locked Moved Unsolved QtWebEngine
10 Posts 3 Posters 2.8k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • H Offline
    H Offline
    haifisch
    wrote on last edited by
    #1

    I have a class for parsing pages:
    loader.h

    #ifndef LOADER_H
    #define LOADER_H
    
    #include <QObject>
    #include <QNetworkAccessManager>
    #include <QNetworkReply>
    
    class Loader : public QObject
    {
        Q_OBJECT
    public:
        explicit Loader(QObject *parent = nullptr);
        void makeRequest(QString endPointRequest);
    signals:
        void dataReadyRead(QByteArray);
    public slots:
        void ReadRead(QNetworkReply *reply);
    private:
        QNetworkAccessManager *m_manager= new QNetworkAccessManager(this);
    };
    
    #endif // LOADER_H
    

    loader.cpp

    #include "loader.h"
    
    Loader::Loader(QObject *parent) : QObject(parent)
    {
        connect(m_manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(ReadRead(QNetworkReply*)));
    }
    
    void Loader::makeRequest(QString endPointRequest)
    {
        m_manager->get(QNetworkRequest(QUrl(endPointRequest)));
    }
    
    void Loader::ReadRead(QNetworkReply *reply)
    {
        QByteArray myData;
        myData = reply->readAll();
        emit dataReadyRead(myData);
    }
    

    And in the basic form I pass the reference for parsing :

    MainWindow::MainWindow(QWidget *parent) :
            QMainWindow(parent),
            ui(new Ui::MainWindow)
        {
            ui->setupUi(this);
            connect(&theLoader,SIGNAL(dataReadyRead(QByteArray)),this,SLOT(dataUploaded(QByteArray)) );
        }
        ...
        void MainWindow::on_pushButton_4_clicked()
        {
            theLoader.makeRequest("http://ru.wikipedia.org/w/api.php?action=query&format=json&titles=Ключевая%20ставка%20в%20России");
        }
        
        void MainWindow::dataUploaded(QByteArray data)
        {
            QString dataString;
            dataString = data;
            ui->apiResponseDisplay->setText(dataString);
            qDebug()<<dataString;
        }
    

    This code returns a blank page: "".
    How can I get data from Wikipedia?

    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by VRonin
      #2

      Looks like you are just not handling unicode correcly. could you try with an ascii only process and see if that works, you can use https://en.wikipedia.org/w/api.php?action=query&format=json&titles=lemon

      Also, make sure you have OpenSSL correctly set up as this is an https request.

      You can connect to http://doc.qt.io/qt-5/qnetworkreply.html#sslErrors and http://doc.qt.io/qt-5/qnetworkreply.html#error-1 to detect what's going wrong

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      H 2 Replies Last reply
      1
      • VRoninV VRonin

        Looks like you are just not handling unicode correcly. could you try with an ascii only process and see if that works, you can use https://en.wikipedia.org/w/api.php?action=query&format=json&titles=lemon

        Also, make sure you have OpenSSL correctly set up as this is an https request.

        You can connect to http://doc.qt.io/qt-5/qnetworkreply.html#sslErrors and http://doc.qt.io/qt-5/qnetworkreply.html#error-1 to detect what's going wrong

        H Offline
        H Offline
        haifisch
        wrote on last edited by
        #3

        @VRonin I always get empty results from Wikipedia. Can you write an example, output errors? I do not understand how to use the methods you referred to.

        1 Reply Last reply
        0
        • VRoninV VRonin

          Looks like you are just not handling unicode correcly. could you try with an ascii only process and see if that works, you can use https://en.wikipedia.org/w/api.php?action=query&format=json&titles=lemon

          Also, make sure you have OpenSSL correctly set up as this is an https request.

          You can connect to http://doc.qt.io/qt-5/qnetworkreply.html#sslErrors and http://doc.qt.io/qt-5/qnetworkreply.html#error-1 to detect what's going wrong

          H Offline
          H Offline
          haifisch
          wrote on last edited by
          #4

          @VRonin if(reply->error()) {
          qDebug() << "Error!";
          qDebug() << reply->errorString();
          }
          Does not return an error.

          1 Reply Last reply
          0
          • VRoninV Offline
            VRoninV Offline
            VRonin
            wrote on last edited by VRonin
            #5

            Try this minimal example:

            #include <QCoreApplication>
            #include <QNetworkAccessManager>
            #include <QNetworkReply>
            #include <QNetworkRequest>
            #include <QDebug>
            #include <QTextStream>
            #include <QSslError>
            
            int main(int argc, char *argv[])
            {
                QCoreApplication application(argc, argv);
                QNetworkAccessManager qnam;
                const QNetworkRequest wikireq(QUrl(QStringLiteral("https://en.wikipedia.org/w/api.php?action=query&format=json&titles=lemon")));
                QNetworkReply* wikirep = qnam.get(wikireq);
                QObject::connect(wikirep,&QNetworkReply::finished,[wikirep]()->void{
                    QTextStream repStream(wikirep);
                    qDebug() << "Response Received:\n" << repStream.readAll();
                    wikirep->deleteLater();
                });
                QObject::connect(wikirep,QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),[wikirep]()->void{
                    qDebug() << "Network Error:\n" << wikirep->errorString();
                    wikirep->deleteLater();
                });
                QObject::connect(wikirep,&QNetworkReply::sslErrors,[wikirep](const QList<QSslError> &errors)->void{
                    qDebug() << "SSL Errors:";
                    for(auto&& err : errors)
                        qDebug() << err.errorString();
                    wikirep->deleteLater();
                });
                return application.exec();
            }
            

            "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
            ~Napoleon Bonaparte

            On a crusade to banish setIndexWidget() from the holy land of Qt

            H 3 Replies Last reply
            1
            • VRoninV VRonin

              Try this minimal example:

              #include <QCoreApplication>
              #include <QNetworkAccessManager>
              #include <QNetworkReply>
              #include <QNetworkRequest>
              #include <QDebug>
              #include <QTextStream>
              #include <QSslError>
              
              int main(int argc, char *argv[])
              {
                  QCoreApplication application(argc, argv);
                  QNetworkAccessManager qnam;
                  const QNetworkRequest wikireq(QUrl(QStringLiteral("https://en.wikipedia.org/w/api.php?action=query&format=json&titles=lemon")));
                  QNetworkReply* wikirep = qnam.get(wikireq);
                  QObject::connect(wikirep,&QNetworkReply::finished,[wikirep]()->void{
                      QTextStream repStream(wikirep);
                      qDebug() << "Response Received:\n" << repStream.readAll();
                      wikirep->deleteLater();
                  });
                  QObject::connect(wikirep,QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),[wikirep]()->void{
                      qDebug() << "Network Error:\n" << wikirep->errorString();
                      wikirep->deleteLater();
                  });
                  QObject::connect(wikirep,&QNetworkReply::sslErrors,[wikirep](const QList<QSslError> &errors)->void{
                      qDebug() << "SSL Errors:";
                      for(auto&& err : errors)
                          qDebug() << err.errorString();
                      wikirep->deleteLater();
                  });
                  return application.exec();
              }
              
              H Offline
              H Offline
              haifisch
              wrote on last edited by
              #6

              @VRonin nothing returns""

              1 Reply Last reply
              0
              • VRoninV VRonin

                Try this minimal example:

                #include <QCoreApplication>
                #include <QNetworkAccessManager>
                #include <QNetworkReply>
                #include <QNetworkRequest>
                #include <QDebug>
                #include <QTextStream>
                #include <QSslError>
                
                int main(int argc, char *argv[])
                {
                    QCoreApplication application(argc, argv);
                    QNetworkAccessManager qnam;
                    const QNetworkRequest wikireq(QUrl(QStringLiteral("https://en.wikipedia.org/w/api.php?action=query&format=json&titles=lemon")));
                    QNetworkReply* wikirep = qnam.get(wikireq);
                    QObject::connect(wikirep,&QNetworkReply::finished,[wikirep]()->void{
                        QTextStream repStream(wikirep);
                        qDebug() << "Response Received:\n" << repStream.readAll();
                        wikirep->deleteLater();
                    });
                    QObject::connect(wikirep,QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),[wikirep]()->void{
                        qDebug() << "Network Error:\n" << wikirep->errorString();
                        wikirep->deleteLater();
                    });
                    QObject::connect(wikirep,&QNetworkReply::sslErrors,[wikirep](const QList<QSslError> &errors)->void{
                        qDebug() << "SSL Errors:";
                        for(auto&& err : errors)
                            qDebug() << err.errorString();
                        wikirep->deleteLater();
                    });
                    return application.exec();
                }
                
                H Offline
                H Offline
                haifisch
                wrote on last edited by
                #7

                @VRonin even no error

                1 Reply Last reply
                0
                • VRoninV VRonin

                  Try this minimal example:

                  #include <QCoreApplication>
                  #include <QNetworkAccessManager>
                  #include <QNetworkReply>
                  #include <QNetworkRequest>
                  #include <QDebug>
                  #include <QTextStream>
                  #include <QSslError>
                  
                  int main(int argc, char *argv[])
                  {
                      QCoreApplication application(argc, argv);
                      QNetworkAccessManager qnam;
                      const QNetworkRequest wikireq(QUrl(QStringLiteral("https://en.wikipedia.org/w/api.php?action=query&format=json&titles=lemon")));
                      QNetworkReply* wikirep = qnam.get(wikireq);
                      QObject::connect(wikirep,&QNetworkReply::finished,[wikirep]()->void{
                          QTextStream repStream(wikirep);
                          qDebug() << "Response Received:\n" << repStream.readAll();
                          wikirep->deleteLater();
                      });
                      QObject::connect(wikirep,QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),[wikirep]()->void{
                          qDebug() << "Network Error:\n" << wikirep->errorString();
                          wikirep->deleteLater();
                      });
                      QObject::connect(wikirep,&QNetworkReply::sslErrors,[wikirep](const QList<QSslError> &errors)->void{
                          qDebug() << "SSL Errors:";
                          for(auto&& err : errors)
                              qDebug() << err.errorString();
                          wikirep->deleteLater();
                      });
                      return application.exec();
                  }
                  
                  H Offline
                  H Offline
                  haifisch
                  wrote on last edited by
                  #8

                  @VRonin behold:
                  qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
                  qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
                  qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
                  qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
                  qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
                  Network Error:
                  "Error creating SSL context ()"
                  Response Received:
                  ""

                  Taz742T 1 Reply Last reply
                  0
                  • H haifisch

                    @VRonin behold:
                    qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method
                    qt.network.ssl: QSslSocket: cannot call unresolved function SSL_CTX_new
                    qt.network.ssl: QSslSocket: cannot call unresolved function SSL_library_init
                    qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
                    qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error
                    Network Error:
                    "Error creating SSL context ()"
                    Response Received:
                    ""

                    Taz742T Offline
                    Taz742T Offline
                    Taz742
                    wrote on last edited by Taz742
                    #9

                    @haifisch
                    What platform are you using?
                    For windows you need dll files check this

                    https://stackoverflow.com/questions/30621577/force-qt5-to-load-ssl-dlls-from-exe-dir
                    https://forum.qt.io/topic/17139/solved-how-to-use-ssl-support-without-manualy-building-qt-libraries
                    https://forum.qt.io/topic/15873/openssl-and-qt-need-help/4

                    Do what you want.

                    H 1 Reply Last reply
                    0
                    • Taz742T Taz742

                      @haifisch
                      What platform are you using?
                      For windows you need dll files check this

                      https://stackoverflow.com/questions/30621577/force-qt5-to-load-ssl-dlls-from-exe-dir
                      https://forum.qt.io/topic/17139/solved-how-to-use-ssl-support-without-manualy-building-qt-libraries
                      https://forum.qt.io/topic/15873/openssl-and-qt-need-help/4

                      H Offline
                      H Offline
                      haifisch
                      wrote on last edited by
                      #10

                      @Taz742 On Windows / Thanks. I decided already this problemma.link helped

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved