纯粹出于学习 C++ 和 Qt 的目的,我正在编写一个基于 Qt 的小程序,它从本地目录读取 HTML 文件(最多数百个),修改它们并将它们写回另一个本地目录。
QWebPage
我的第一次尝试是使用QWebElement
. 但是,我遇到了一些由内存泄漏引起的严重问题QWebPage
(这很可能是由于我没有正确使用它造成的。但这是另一个主题,而不是这个问题的一部分)。
到目前为止,我没有使用任何 GUI,尽管我打算稍后再这样做,但我的程序的这一部分永远不会成为 GUI 的一部分,而是在后台的某个地方。
因此,我想替换QWebPage
by的用法QTextBrowser
,这似乎更轻量级。但是,我在 Qt-API 中找不到类似于QWebElement
. 到目前为止,我的代码依赖于QWebElement::findFirst()
,QWebElement::nextSibling()
最后QWebElement::takeFromDocument()
。
QTextBrowser
那么,作为 HTML 解析器实现(或使用)是否有几乎无痛的可能性?甚至可能是“最佳实践”?
我不需要评估任何 JavaScript,尽管它很可能内联在 HTML 页面中。我也不需要使用 CSS 进行样式设置,尽管它在相关的 HTML 页面中被大量使用。我只需要根据它们的 id 或 CSS 类检索某些 HTML 块(作为表格行)。
PS:我只愿意使用现有的 C++ HTML 解析库,以防所有使用纯 Qt 的可行和合理尝试都失败。
PPS:只是为了看到和了解它们,我也想得到现在非凡的解决方案。;-)
这是我当前代码的一部分,我在其中使用QWebElement
. reportPage
是一个QWebPage
对象。
reportPage->document().findFirst( "table[id=gadgettable]" ).findFirst( "tr[class=c2]" ).takeFromDocument();
reportPage->mainFrame()->documentElement().findFirst( "table[id=gadgettable]" ).findFirst( "tr" ).takeFromDocument();
reportPage->mainFrame()->documentElement().findFirst( "table[id=gadgettable]" ).findFirst( "td[id=gadgettable-left-td]" ).takeFromDocument();
reportPage->mainFrame()->documentElement().findFirst( "table[id=gadgettable]" ).findFirst( "td[id=gadgettable-right-td]" ).takeFromDocument();
reportPage->mainFrame()->documentElement().findFirst( "table[id=gadgettable]" ).findFirst( "tr" ).nextSibling().takeFromDocument();
reportPage->mainFrame()->documentElement().findFirst( "table[id=gadgettable]" ).findFirst( "tr" ).nextSibling().takeFromDocument();