0

我正在尝试解析 html 源代码。这是我要解析的网页地址。我已经编写了下面的代码,但它在我想提取元内容的最后一步不起作用:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QNetworkAccessManager manager;
    QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("https://www.instagram.com/p/BTwnRykl6EM/")));
    QEventLoop event;
    QObject::connect(reply, SIGNAL(finished()), &event, SLOT(quit()));
    event.exec();
    QString me = reply->readAll();
    QString x;
    //-------------------------------------------------------------------------------------------------------
    //qDebug()<<me;
    //-------------------------------------------------------------------------------------------------------
    QXmlStreamReader reader(me);
    if(reader.readNextStartElement()){
        if(reader.name()=="html"){
            while (reader.readNextStartElement()) {
                if(reader.name()=="head"){
                    while (reader.readNextStartElement()) {
                        if(reader.name()=="meta" && reader.attributes().hasAttribute("property") && reader.attributes().value("property").toString()=="og:image")
                            x = reader.attributes().value("content").toString();
                        else{
                            qDebug()<<"why?";
                            reader.skipCurrentElement();
                        }
                    }
                }
                else
                    reader.skipCurrentElement();
            }
        }
        else
            reader.skipCurrentElement();
    }
    qDebug()<<x;
    return 0;
}

这部分不起作用:

if(reader.name()=="meta" && reader.attributes().hasAttribute("property") && reader.attributes().value("property").toString()=="og:image")
    x = reader.attributes().value("content").toString();
else{
    qDebug()<<"why?";
    reader.skipCurrentElement();
}

并打印

为什么?

我的代码有什么问题?

4

1 回答 1

1

HTML 不是有效的 XML,因此您不能使用 XML 解析器。您可以在此 wiki 页面上找到 HTML 选项。很快,您可以使用 Qt 的 Scribe 框架或 QtWebKit 来自动解析和呈现 HTML,或使用外部库进行手动解析:

libxml2libhtml是 C 库,htmlcxx是 C++ 库,它允许构建 dom-tree 并对其进行迭代。

于 2018-06-01T10:54:06.287 回答