c++ - 来自 html 的 Qt 中的字符串匹配

标签 c++ qt indexof

我正在尝试从 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 class提供对 (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:\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 好,因为这里需要遍历节点列表并手动检查节点类型及其属性“类”,例如

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

关于c++ - 来自 html 的 Qt 中的字符串匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32423287/

相关文章:

c++ - 如何在父类(super class)方法的参数中使用子类?

java - java/spring 和 c++/qt 应用程序之间使用 websockets 进行通信

c++ - QPixmap::fromImage() 在 QX11PixmapData 中给出段错误

arraylist - Big O 运行时 - indexOf LinkedList/ArrayList

javascript - 如何删除查询字符串的最后一部分

C++ float 和 valgrind 奇怪的行为

c++ - set 和 compering/sorting functor 或 less 运算符

javascript - 如何显示字符串中每次出现字符的位置?

c++ - 使用指针,不调用重写的方法

c++ - 在 C++ 中具有单个 openGL 上下文的多个 QGLWidgets