【问题标题】:Jsoup like html parser for C++ [closed]Jsoup 类似于 C++ 的 html 解析器 [关闭]
【发布时间】:2019-02-06 22:27:50
【问题描述】:

我一直在编写一些代码来从 Java 中的某些页面获取一些数据,而 Jsoup 是最好的库之一。但是,不幸的是,我必须将整个代码移植到 C/C++。但是我找不到任何可以在 c++ 上使用的像样的 html 解析器。是否有任何类似 Jsoup 的 C++ 库或如何实现类似的结果?

[目前我正在使用Curl来获取页面的来源并在互联网上漫游以查找html解析器]

【问题讨论】:

  • 那里有 really good XML parsers,但我不知道一个好的 C++ HTML 特定解析器
  • JNI 会成为您的解决方案吗?
  • 我可能不想使用 JNI。我对此没有太多想法。而且我还想让项目的依赖性降低[除非必要]。
  • 另外澄清一下,我需要的只是解析文档并从中获取一些值,以及使用 CSS Selector[preferably] 或 Xpath 返回的可靠方法。此外,如果解析器非常快,那就太好了,因为我将浏览超过 100,000 个页面来维护数据库。
  • 谷歌开源 Gumbo:github.com/google/gumbo-parser

标签: c++ html css-selectors jsoup


【解决方案1】:

不幸的是,我猜没有像 Jsoup 这样的 C++ 解析器 ...

除了这里已经提到的库之外,这里还有一个关于 C++(也有一些 C)解析器的很好的概述:Free C or C++ XML Parser Libraries

对于解析,我使用TinyXML-2 进行(Html-)DOM 解析;这是一个非常小的(只有 2 个文件)库,可在大多数操作系统(甚至非桌面)上运行。

LibXml

  • 推拉解析器(DOM、SAX)
  • 验证
  • XPath 和 XPointer 支持
  • 跨平台/良好的文档

Apache Xerxces

  • 推拉解析器(DOM、SAX)
  • 验证
  • 不支持 XPath(但有一个包?)
  • 跨平台/良好的文档

如果您使用 C++ CLI,请查看 NSoup - .NET 的 Jsoup 端口。

更多:

也许您可以将 DOM 模型/解析器和 CSS 选择器组合在一起?

【讨论】:

  • 我什至没有想到只有一个 CSS 选择器!!! 【我怎么这么傻!!!我通过 cURL 获取页面的源代码,其余的由 CSS 选择器完成!!!]。感谢您指出这一点。
  • LibDOM 不兼容 C++,因为它使用关键字命名空间作为结构的成员变量。
【解决方案2】:

如果您熟悉 Qt 框架,最方便的方法是使用 QWebElement(参考 here)。

否则,(正如另一篇文章所建议的)使用Tidy 将HTML 转换为有效的XML,然后使用诸如libxml++ 之类的XML 解析器是一个不错的选择。您可以找到显示这两个步骤的示例代码here

【讨论】:

  • +1 用于提及 QWebElement。甚至不知道它的存在。
  • 我也不知道。 :D +1。这确实是最简单的解决方案,但对 Qt 的依赖也是一个问题 [对我来说]...
【解决方案3】:

Chromium 有一个开源 parser。此外,Google gumbo-parser 看起来很酷。

【讨论】:

  • 非常感谢。让我们希望它浮出最高投票的答案
【解决方案4】:

是的,有一个用于 c++ 的 html 解析器库,检查一下 https://github.com/HamedMasafi/HtmlParser/

这个库可以解析 html 或 css 并将其转换为树模型。您可以通过 get_by_id、get_by_class_name、get_by_tag_name 等方法在解析后的 html 中搜索,还有一个问题方法可以通过 css 选择器搜索(目前仅支持标签、id、类、嵌套子选择器)。

找到一个孩子后,您可以更改它的属性,最后您可以以紧凑和漂亮的模式将 html 打印到 std::string 中。

【讨论】:

  • 仅仅链接到您自己的库或教程并不是一个好的答案。链接到它,解释它为什么解决问题,提供如何解决问题的代码,并否认你编写了它,这样可以得到更好的答案。见:What signifies “Good” self promotion?
  • 好的,感谢您的评论。
【解决方案5】:

您可以使用xerces2 作为 DOM 解析器。

或使用HTML Tidy 清理HTML 并将其转换为XHTML,然后使用pugixml 或类似的XML 解析器解析XML。而且由于 pugixml 是一个非验证解析器,它还可以在原始 HTML 上工作,而无需先在其上运行 HTML Tidy。

【讨论】:

    【解决方案6】:

    如果你不介意从 C++ 调用 python,你可以使用Beautiful Soup。至少名字是对的!

    说真的 - 这是一个不错的、严肃的 HTML 解析器。我没有尝试从 C++ 调用它,虽然它应该简单明了。

    【讨论】:

      猜你喜欢
      • 2011-12-25
      • 2011-09-12
      • 2012-08-01
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 2016-07-12
      • 1970-01-01
      相关资源
      最近更新 更多