访问使用QNetworkReply检索的html表

时间:2015-09-06 18:22:37

标签: c++ qnetworkaccessmanager qwebpage qnetworkreply qwebelement

我想阅读我在http://finance.yahoo.com/exchanges看到的表格的后缀列。

我使用QNetworkManager阅读了该页面。将数据存储在QNetworkReply *reply中。如果我用reply->readAll()读取所有页面,我会获取页面,因此可以正确检索。我将它设置在QWebPage内,然后我想检索内部的所有表。

为了获得表格,我想使用QWebElement,但我无法阅读它。我读了所有与我想要的相同级别的表,但我得到的QWebElementCollection是空的。

我做错了什么,为了阅读这张桌子我必须做什么?

void getMarketListFromReply(QNetworkReply *reply) {
    std::cout << "Reading page" << std::endl;
    const QString html(reply->readAll()); // html contain the code
    QWebPage page;
    std::cout << "Setting page." << std::endl;
    page.mainFrame()->setHtml(html);
    std::cout << "Retrieving tables" << std::endl;
    QWebElementCollection tables = page.mainFrame()->documentElement().findAll("html body div.screen div.content table");
    const int size = tables.count();  // size it's 0 :-(
    std::cout << "size: " << size << std::endl;
    for (int i = 0; i < size; i++) {
        std::cout << i << ": " << tables.at(i).toPlainText().toStdString() << std::endl;
    }
}

1 个答案:

答案 0 :(得分:0)

findAll()选择器中的点表示标记类。但是,在您的情况下,“屏幕”和“内容”是可以通过锐利(#)选择的元素ID。因此,以下选择器应该可以工作

.findAll("html body div#screen div#content table");
.findAll("#content table");