如何使用C++/Qt解析HTML?

7
我该如何解析以下HTML?
<body>
<span style="font-size:11px">12345</span>
<a>Hello<a>
</body>

我想从www.testtest.com的style="font-size:11px"的"span"中检索数据"12345",但我只想要这个数据,不需要其他任何东西。
我该如何实现这个目标?
2个回答

8

我认为QXmlQuery是你想要的工具。 我认为代码应该是这样的

QXmlQuery query;

query.setQuery(html, QUrl("/body/span[@style='font-size:11p']"));

QString r;
query.evaluateTo(&r);

您可以直接提供URL来查询。
query.setQuery(QUrl("http://WWW.testtest.com"), QUrl("/body/span[@style='font-size:11p']"));

我认为qtxmlpatterns(因此这个建议)对于这个简单的任务来说有点过头了。QtWebKit可以很好地处理HTML,或者如果有人希望避免甚至那个,那么QtCore的XML解析器也可以胜任。然而,如果涉及到HTML,则很可能还需要从webkit中获取其他功能。 - László Papp
3
@LaszloPapp,QtWebkit比xmlpatterns重得多。实际上,QtWebkit是最大的Qt部件。 - Lol4t0
Lol4t0:你的答案对我来说仍然没有意义。如果他已经必须使用webkit,那就完全没有添加额外的依赖项了。否则,他将需要使用QtCore。无论如何,你的答案都是错误的。因为今天已经达到限制,所以明天我会给一个负一分。 :) 基本上,你建议使用一个未维护的额外依赖项。那很糟糕。 - László Papp
请重新阅读一下。我写了“if”。还请查看我的回复和之前的评论。 - László Papp
1
好的,从Qt 5.6开始,QtWebKit已经不存在了,因此这现在是更正确的答案。 - Romário

3
编辑:来自Qt 5.6发布博客文章

从5.6开始,Qt WebKit和Qt Quick 1将不再受支持并从发布中删除。这些模块的源代码仍将可用。

因此,在Qt 5.6中,除非你愿意编译源代码,否则将不再提供QtWebKit。如果您使用的是早于5.6版本的Qt或愿意编译QtWebKit,则可能会有所帮助;否则此答案已不再有效


由于您的说明不完整,很难准确告诉您需要做什么。但是,有两种方法可以进行。

QtWebKit

如果您已经需要该模块的其他功能,则这不会引入任何进一步的依赖关系,并且对您来说将是最方便的。

您需要获取https://doc.qt.io/archives/qt-5.5/qwebelement.html

找到html中第一个“span”元素后,就可以获得该元素:

https://doc.qt.io/archives/qt-5.5/qwebframe.html#findFirstElement

然后,您可以使用相应的QWebElement方法获取该元素的文本。例如,您可以使用以下方法获取属性值:

https://doc.qt.io/archives/qt-5.5/qwebelement.html#attribute

......但是,您还可以请求属性名称,如文档中所示。

这就是您将获取12345值的方式:

https://doc.qt.io/archives/qt-5.5/qwebelement.html#toPlainText

QtCore中的XML解析器

如果您的软件不需要使用webkit,并且html数据来自于不同的来源而非直接从网络获取,那么最好使用QtCore中提供的xml解析器。即使您没有从QtWebKit获取其他依赖项,这种额外的依赖项也可能不会对您的用例造成任何问题。根据您的描述很难判断。当然,与基于webkit的解决方案相比,这将会不那么方便,但差别不是很大,因为后者是为html设计的。
您需要避免使用QtXmlPatterns。目前它是未维护的软件,无论如何都会为您的代码引入额外的依赖项。

QtWebKit已从Qt中删除,因此此答案已过时。除了QtXmlPatterns之外,是否有其他替代品? - Romário
1
也许普通的正则表达式比整个浏览器更适合?他只需要一些值。 - ilotXXI

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接