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。此模块不受积极支持,但它还通过 QDomDocument
、QDomElement
和 QDomNodeList
类 为文档元素的树结构提供 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';
}
}
我正在尝试从 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。此模块不受积极支持,但它还通过 QDomDocument
、QDomElement
和 QDomNodeList
类 为文档元素的树结构提供 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';
}
}