2015-09-06 28 views
1

我試圖從html中獲取特定的單詞,並在當前的純文本編輯中顯示它們(稍後我將它們添加到表中)。儘管我設法得到了這個詞的開頭,但我無法得到最後的結果。它顯示了起始位置的所有內容。 html是這樣的:Qt中從字符串匹配的字符串

<span class="title">Some name here</span> 

這是我寫的代碼。

int sTitle = html_code.indexOf("title\">") + 7; 
int eTitle = html_code.indexOf("</span>"); 
int titLength = eTitle - sTitle; 

QString title = html_code.mid(sTitle, titLength); 

ui->searchBox->setPlainText(title); 

而且html中還有很多/ span和title標籤。謝謝!

回答

1

你的代碼完美地工作,如果下面的字符串被分配到html_code

QString html_code = "<span class=\"title\">Some name here</span>"; 

然而,對於更復雜的文檔,你可以考慮重,但功能強大的工具QtWebKit的使用和其提供了訪問(X)HTML文檔的DOM元素的樹結構的QWebElement class。它可以讓你只搜索首先感興趣的條目的特定標籤(或更復雜的結構)或集合,例如

#include <QWebPage> 
#include <QWebFrame> 
#include <QWebElement> 

void MainWindow::some_handler() 
{ 
    QString html_code = "<span class=\"title\">Some name here</span>" 
     "<span class=\"title\">Some other name here</span>"; 

    QWebPage page; 
    QWebFrame *frame = page.mainFrame(); 
    frame->setHtml(html_code); 
    QWebElement document = frame->documentElement(); 

    // one item 
    QWebElement title = document.findFirst("span.title"); 

    QString text; 
    text += "First title span:\n\t" + title.toPlainText() + '\n'; 

    // all items 
    QWebElementCollection title_collection = document.findAll("span.title"); 
    text += "\nAll title spans:\n"; 

    foreach (QWebElement elem, title_collection) { 
     text += '\t' + elem.toPlainText() + '\n'; 
    } 

    ui->searchBox->setPlainText(text); 
} 

以下模塊應在項目文件QT += webkitwidgets被添加到構建上面的代碼。

請注意,QWebPage對象就像瀏覽器一樣工作。它加載鏈接的內容並運行JavaScript。如果不需要其他xml解析器,例如Qt XML module。此模塊不被支持,但它也通過QDomDocument,QDomElementQDomNodeList類爲文檔元素的樹結構提供API。該代碼是不是很好,與QWebElement,因爲這需要遍歷節點列表,並手動檢查節點類型及其attribude「類」,例如

QDomDocument document; 
document.setContent(html_code); 
QDomElement elem = document.documentElement(); 
QDomNodeList node_list = elem.elementsByTagName("span"); 
QString text; 
for (int i = 0; i < node_list.length(); ++i) { 
    if (node_list.at(i).isElement() && 
     node_list.at(i).toElement().attribute("class") == "title") 
    { 
     text += node_list.at(i).toElement().text() + '\n'; 
    } 
} 
+1

的Qt WebKit的已被廢棄,不應該被推薦在此刻。此外,假設您可以使用XML解析器解析HTML而不先通過HTML到XHTML轉換器運行它,這並不安全。 – MrEricSir

+0

@MrEricSir,感謝您的有用評論。我同意這兩點。不幸的是,Qt WebKit棄用並未在其活躍的Qt 5.5文檔中直接提及,但有一些帖子與此相關。因此,開發人員必須對前向兼容性做出選擇。 –

+0

@OrestHera,我想知道我的「感謝」評論如何被刪除!這解決了我的問題!謝謝!通過indexOf函數很難完成它! –

0

試試這個:

int sTitle = html_code.indexOf("title\">") + 7; 
int eTitle = html_code.indexOf("</span>"); 
QStringRef title(html_code, sTitle, eTitle); 
ui->searchBox->setPlainText(title.toString());