Веб-скрапинг с QWebView и QWebElement возвращает увеличивающиеся кратные

В настоящее время я работаю над программным обеспечением, которое будет запрашивать сайт collecter.magic.com для создания базы данных карт. При тестировании своих функций я обнаружил, что получаю странные результаты. Мои функции следующие:

void cardDB::updateDB()
{
    this->view = new QWebView;
    QString urlString("http://gatherer.wizards.com/Pages/Card/Details.aspx?  multiverseid=");

    for(int i = 1; i <= 4; i++)
    {

        // Load the page
        view->load(QUrl(urlString+QString::number(i)));
        QObject::connect(view, SIGNAL(loadFinished(bool)), this, SLOT(saveFile()));

        // Wait for saveFile() to finish
        QEventLoop loop;
        QObject::connect(this, SIGNAL(done()), &loop, SLOT(quit()));

        loop.exec();
    }
}

void cardDB::saveFile()
{
    QString fileName("test");
    // Grab the name tag
    QWebElement e = view->page()->mainFrame()->findFirstElement("div#ctl00_ctl00_ctl00_MainContent_SubContent_SubContent_nameRow");
    QString pageString = e.toPlainText();
    pageString.remove(0, 11);

    QFile localFile(fileName +".txt");
    if (!localFile.open(QIODevice::Append))
    {
        // Still need to implement error catching
    }
    else
    {
        localFile.write(pageString.toUtf8());
        localFile.close();
    }

    emit done();
}

мои результаты выглядят так:

Ankh of Mishra
Basalt Monolith
Basalt Monolith
Black Lotus
Black Lotus
Black Lotus
Black Vise
Black Vise
Black Vise
Black Vise

Прежде чем я добавил цикл событий, я бы просто получил имя i-карты i раз, теперь оно, кажется, совпадает в зависимости от того, какой номер в цикле.


person Jeremy Natale    schedule 30.07.2015    source источник


Ответы (1)


Следующая строка кода, добавленная в конце цикла for, устранила мою проблему:

QObject::disconnect(view, SIGNAL(loadFinished(bool)), this, SLOT(saveFile()));

Я полагаю, это было потому, что на каждой итерации цикла я подключал новую комбинацию сигнал/слот, чтобы каждая из них происходила, когда проходил сигнал loadFinished.

person Jeremy Natale    schedule 30.07.2015
comment
Я был пойман этим раньше - я всегда думаю, было бы неплохо, если бы был тест, чтобы увидеть, было ли уже установлено соединение, прежде чем вы установите соединение. Может и есть, просто я еще не нашел. - person Michael Vincent; 30.07.2015
comment
Разговаривая с моим другом, который довольно хорошо знает Qt, он также указал, что я мог бы использовать: QObject::connect(view, SIGNAL(loadFinished(bool)), this, SLOT(saveFile()), Qt::UniqueConnection); Это делает то, что вы спрашивали о Майкле. - person Jeremy Natale; 30.07.2015