【问题标题】:Access to html table retrieved with QNetworkReply访问使用 QNetworkReply 检索的 html 表
【发布时间】:2015-09-06 18:22:36
【问题描述】:

我想阅读我在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;
    }
}

【问题讨论】:

    标签: c++ qnetworkaccessmanager qwebpage qnetworkreply qwebelement


    【解决方案1】:

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

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

    【讨论】:

    • 还不行。我也尝试只使用.findAll("html"),但大小始终为零...
    • @Jepessen 我在没有QNetworkReply 的情况下做了简单的测试。页面finance.yahoo.com/exchanges 被保存到文件中。因此,当我从文件中获取该文档时,我的两个解决方案都应提供size 4。但是,.findAll("html") 确实给出了零大小。
    • QWebElementCollection tables = page.mainFrame()-&gt;findAllElements("html head"); 返回一个元素,但 QWebElementCollection tables = page.mainFrame()-&gt;findAllElements("html body"); 返回 0 个元素。就好像它没有找到正文,但存在于 html 中。
    • @Jepessen 一些魔法。永远找不到“html”是正常行为,因为findAll 返回匹配给定 CSS 选择器的子元素,而“html”不是子元素。但是,对于“html body”,我看到了正确的结果 1。您使用的 HTML 文档可能已损坏。
    猜你喜欢
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多