2015-06-06 62 views
0

我的HTML格式爲QByteArray,我想解析它。爲什麼QWebFrame忽略了我的HTML的很大一部分?

QWebPage webpage; 
webpage.mainFrame()->setContent(html); 
QWebElementCollection elements = webpage.mainFrame()->findAllElements("div"); 

然而,它變成了空,即使HTML有很多<div>秒。

如果我打印qDebug() << webpage.mainFrame()->toHtml();所有我看到的是"<html><head></head><body></body></html>"炭黑在html有一個不錯的大頁面,與標題,正文,表格和內容。

如果我使用setHtml而不是setContent通過將html轉換爲QString,我得到了更多,但不多。如果我打印qDebug() << webpage.mainFrame()->toHtml();,我會看到標題及其內容,但沒有樣式表,但是主體完全被省略。它與"...</head></html>"

回答

1

對於大型內容結束後,DOM結構可能不只是調用setContentsetHtml後可用,你應該讓事件循環運行,並在DOM做任何事情之前等待信號QWebPage::loadFinished()(甚至那麼,如果涉及JavaScript,最終的DOM將不會在那裏)。

您可以使用QEventLoop或使用QCoreApplication::processEvents()的循環等待同一功能內的信號。 例如:

QWebPage webpage; 

QEventLoop loop; 
// The signal is connected with Qt::QueuedConnection, 
// so that the loadFinished signal always trigger the quit() slot 
// even if the loop wasn't needed 
QObject::connect(&webpage, SIGNAL(loadFinished(bool)), &loop, SLOT(quit()), 
       Qt::QueuedConnection); 
webpage.mainFrame()->setContent(html); 

loop.exec(); 

QWebElementCollection elements = webpage.mainFrame()->findAllElements("div"); 
+0

我認爲這只是如果我使用'負載發生()'從外部(網絡)資源獲取頁面。如果我等待'loadFinished'信號,它現在可以工作。這一切現在都是有道理的,原來,'setHtml'可能比'setContent'加載了一點點,因爲'QString'的轉換。 – vsz

+0

@vsz我修改了代碼:發出信號,但在exec()有時間運行之前,quit()插槽被同步調用。通過在調用setContent之前連接槽並使用'Qt :: QueuedConnection',槽的調用被延遲,直到循環開始(因此,我不確定是否有一個小的解決方案爲大和'processEvents'中的小內容)。 – alexisdm

+0

對於更大的文件大小,單獨的線程可能是最好的解決方案,但是這個簡單而優雅的解決方案現在可以工作,並且足以完成手頭的任務。感謝您的時間! – vsz

相關問題