Соответствие строк в Qt из HTML

Я пытаюсь извлечь определенные слова из 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. Спасибо!

1

Решение

Ваш код работает отлично, если следующая строка назначена html_code:

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

Однако для более сложных документов вы можете использовать тяжелый, но мощный инструмент. QtWebKit И его QWebElement учебный класс это обеспечивает доступ к древовидной структуре элементов DOM (X) HTML-документа. Это позволит вам искать только первый конкретный тег (или более сложные структуры) или коллекцию всех интересных записей, например

#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. Этот модуль не поддерживается активно, однако он также предоставляет API для древовидной структуры элементов документа через QDomDocument, QDomElement а также QDomNodeList классы. Код не так хорош, как с 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';
}
}
1

Другие решения

попробуй это:

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

По вопросам рекламы [email protected]