为了学习C ++和Qt的纯粹目的,我正在编写一个基于Qt的小程序,它从本地目录读取HTML文件(最多几百个),修改它们并将它们写回另一个本地目录。 / p>
我的第一次尝试是使用QWebPage
和QWebElement
提供的HTML解析功能。但是我遇到了由QWebPage
引起的内存泄漏的一些严重问题(这很可能是因为我没有以正确的方式使用它。但这是另一个主题而不是这个问题的一部分。)
到现在为止我没有使用任何GUI,虽然我打算稍后这样做,但我的程序的这部分将永远不会成为GUI的一部分,而是在后台的某个地方。
因此,我将QWebPage
的用法替换为QTextBrowser
,这似乎更轻量级。但是,我在Qt-API中找不到与QWebElement
的解析函数类似的函数。到目前为止,我的代码依赖QWebElement::findFirst()
,QWebElement::nextSibling()
,最后依赖QWebElement::takeFromDocument()
。
那么,实现(或使用)QTextBrowser
作为HTML解析器是否几乎无痛?甚至可能是“最佳实践”?
虽然很可能在HTML页面中内联,但我不需要评估任何JavaScript。我也不需要使用CSS来设置样式,尽管它在相关的HTML页面中被大量使用。我只需要根据它们的id或CSS类检索某些HTML块(如表行)。
PS:我只愿意使用现有的C ++ HTML解析库,以防所有使用纯Qt的可行和理性尝试失败。
PPS:只是为了看到和了解它们,我还想现在得到非凡的解决方案。 ; - )以下是我当前代码的一部分,我使用QWebElement
解析并删除HTML页面的某些部分。 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();
答案 0 :(得分:2)
QTextBrowser不是为您提议的那种编辑而设计的。但是,根据您的描述,QDomDocument / QDomElement代码可能适合您 - 具体取决于您的输入文档是否足够XML兼容,以便DOM类可以再次接受和写出。 (特别是,这种方法可能会失去元素的格式化)
核心DOM代码也缺乏高级查询支持 - 您需要手动搜索DOM以获取id属性,或者使用更高级的XPath / XQuery支持。