Как парсить с Википедии в Qt?

228
10 мая 2018, 07:49

У меня есть класс для парсинга страниц под названием Loader:

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);
}

И в основной форме я передаю ссылку для парсинга :

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/wiki/Ключевая_ставка_в_России");
}
void MainWindow::dataUploaded(QByteArray data)
{
    QString dataString;
    dataString = data;
    ui->apiResponseDisplay->setText(dataString);
    qDebug()<<dataString;
}

Причём какую я бы ссылку не добавлял http://ru.wikipedia.org/wiki/Ключевая_ставка_в_России, http://ru.wikipedia.org/w/index.php?title=%D0%9A%D0%BB%D1%8E%D1%87%D0%B5%D0%B2%D0%B0%D1%8F_%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0_%D0%B2_%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8&oldid=91903866, http://ru.wikipedia.org/w/index.php?title=Ключевая_ставка_в_России&oldid=91903866

Все равно возвращается пустая страница: "". Как мне спарсить данные с Википедии?

Answer 1

Минимально достаточный код для парсинга:

#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();
}

Но на этом не всё, надо ещё выполнить указания по ссылки, если вы работаете в Windows. После чего скопировать две библиотеки(libeay32.dll,ssleay32.dll) из папки bin установленной программы и подключить их в pro файле LIBS += -Llibeay32 -Lssleay32

READ ALSO
Error: No CUDA support (The library is compiled without CUDA support) in throw_no_cuda

Error: No CUDA support (The library is compiled without CUDA support) in throw_no_cuda

Возникла проблема с использованием в cuda в OpenCV

196
Как считать текст из textbox в массив?

Как считать текст из textbox в массив?

Суть задания в том что нужно с файла считать текст в текстбокс примерно такой:

332
Ближайшие точки соприкосновения

Ближайшие точки соприкосновения

Используя классы–контейнеры и классы-итераторы STL:Определите класс Triangle (треугольник) и класс Circle (круг)Определите функцию, которая рисует...

242
error creating ssl context () qt

error creating ssl context () qt

Пытаюсь запустить простой пример парсинга с Википедии, но он выдаёт ошибку :

217