2015-09-06 349 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());