是否值得使用QTextBrowser在后台解析和修改HTML页面而不是QWebPage?

时间:2011-12-19 20:28:15

标签: qt html-parsing qwebkit

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

我的第一次尝试是使用QWebPageQWebElement提供的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页面的某些部分。 reportPageQWebPage个对象。

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();

1 个答案:

答案 0 :(得分:2)

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

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