字符串匹配在Qt从html

String matching in Qt from an html

本文关键字:html Qt 字符串 串匹配 字符      更新时间:2023-10-16

我正在尝试从html中获取特定的单词,并将它们显示在纯文本编辑中(稍后将它们添加到表中)。尽管我设法弄明白了这个词的开头部分,但我还是弄不清结尾部分。它显示从起始位置开始的所有内容。html是这样的:

<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标签。谢谢你!

如果将以下字符串分配给html_code,您的代码将正常工作:

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

然而,对于更复杂的文档,你可以考虑使用强大的工具QtWebKit和它的QWebElement类,提供访问(X)HTML文档的DOM元素的树状结构。它将允许您只搜索第一个特定的标记(或更复杂的结构)或所有感兴趣的条目的集合,例如

#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:nt" + 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模块。该模块不被积极支持,但是它也通过QDomDocument, QDomElementQDomNodeList类提供了用于文档元素树结构的API。代码不像QWebElement那么好,因为这里需要遍历节点列表并手动检查节点类型及其属性"class",例如

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';
    }
}

try this:

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