1

纯粹出于学习 C++ 和 Qt 的目的,我正在编写一个基于 Qt 的小程序,它从本地目录读取 HTML 文件(最多数百个),修改它们并将它们写回另一个本地目录。

QWebPage我的第一次尝试是使用QWebElement. 但是,我遇到了一些由内存泄漏引起的严重问题QWebPage(这很可能是由于我没有正确使用它造成的。但这是另一个主题,而不是这个问题的一部分)。

到目前为止,我没有使用任何 GUI,尽管我打算稍后再这样做,但我的程序的这一部分永远不会成为 GUI 的一部分,而是在后台的某个地方。
因此,我想替换QWebPageby的用法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();
4

1 回答 1

2

QTextBrowser 不是为您提议的那种编辑而设计的。但是,根据您的描述,QDomDocument / QDomElement 代码可能适合您 - 取决于您的输入文档是否与 XML 充分兼容,可以被 DOM 类再次接受和写出。(特别是,这种方法可能会丢失元素的格式)

此外,核心 DOM 代码缺乏高级查询支持 - 您需要手动搜索 DOM 以获取 id 属性,或者使用更高级的 XPath / XQuery 支持。

于 2011-12-19T22:36:58.333 回答