Qt 中来自 html 的字符串匹配

String matching in Qt from an html

我正在尝试从 html 中提取特定的单词,并暂时以纯文本编辑形式显示它们(稍后我会将它们添加到 table 中)。尽管我设法得到了单词的开头,但我无法得到结尾部分。它显示从起始位置开始的所有内容。 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.Thank 你里面还有很多 /span 和 title 标签!

试试这个:

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

如果将以下字符串分配给 html_code:

,您的代码将完美运行
 QString html_code = "<span class=\"title\">Some name here</span>";

然而,对于更复杂的文档,您可以考虑使用笨重但功能强大的工具 QtWebKit 及其 QWebElement class,它提供对 (X)[= 的 DOM 个元素的树结构的访问33=] 文件。它将允许您只搜索第一个特定标签(或更复杂的结构)或所有有趣条目的集合,例如

#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。此模块不受积极支持,但它还通过 QDomDocumentQDomElementQDomNodeList 类 为文档元素的树结构提供 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';
    }
}