C++类似于Jsoup的HTML解析器

19

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

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


有一些非常好的XML解析器,但我不知道是否有一个好的C++ HTML特定解析器。 - nikolas
JNI对你来说是一个解决方案吗? - suspectus
我可能不想使用JNI。我对它没有太多的了解。而且我也想让项目尽量少依赖(除了必要的)。 - Writwick
并且为了澄清,我所需要的只是解析文档并从中获取一些值,并使用CSS选择器[最好]或XPath返回可靠的方法。此外,如果解析器非常快,那将非常好,因为我将浏览超过100,000个页面来维护数据库。 - Writwick
我不知道与Jsoup相比如何,但是请参阅“HTML解析器比较”(http://en.wikipedia.org/wiki/Comparison_of_HTML_parsers)以获取各种语言中解析器的详细列表。 - jww
2
Google开源了Gumbo:https://github.com/google/gumbo-parser - CC.
6个回答

13

很遗憾,我猜在C++中没有像Jsoup那样的解析器...

除了这里已经提到的库之外,这里有一个关于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端口。

还有一些:

  • LibCSS(CSS解析器) / LibDOM(文档对象模型)(但都是C语言)
  • hcxselect(C++的CSS选择器引擎)
  • 也许您可以将文档对象模型/解析器和CSS选择器组合在一起?


    我甚至没有想到只需要一个CSS选择器!!![我真是太傻了!!!我通过cURL获取页面源代码,然后CSS选择器就可以完成剩下的工作!!!]。感谢您指出这一点。 - Writwick
    LibDOM不兼容C++,因为它将关键字namespace用作结构体的成员变量。 - Czipperz

    9
    如果您熟悉Qt框架,最方便的方法是使用QWebElement(参考这里)。
    否则,(如另一篇帖子建议的那样)使用Tidy将HTML转换为有效的XML,然后使用XML解析器,例如libxml ++是一个不错的选择。您可以在这里找到展示这两个步骤的示例代码。

    +1 提到 QWebElement。甚至不知道它的存在。 - huysentruitw
    我也不知道。:D +1. 这确实是最简单的解决方案,但对于我来说,依赖于Qt是一个问题... - Writwick

    7

    1
    非常感谢。希望它能浮到最高票答案的位置。 - sehe

    3
    是的,有一个适用于c++的html解析库,请查看https://github.com/HamedMasafi/HtmlParser/
    该库可以解析html或css并将其转换为树形模型。您可以通过get_by_id、get_by_class_name和get_by_tag_name等方法在解析后的html中进行搜索,还有一个问题方法,您可以通过css选择器进行搜索(目前仅支持标签、id、class和嵌套子选择器)。
    找到子元素后,您可以更改其属性,并最终将html以紧凑和漂亮的方式打印到std::string中。

    2
    仅仅链接到自己的库或教程并不是一个好的回答。链接到它,解释为什么它可以解决问题,提供如何实现的代码,并声明你编写了它,这样会得到更好的回答。参见:什么是“好”的自我推广? - Suraj Rao
    好的,感谢您的评论。 - Hamed Masafi

    1
    你可以使用xerces2作为DOM解析器。
    或者使用HTML Tidy清理HTML并将其转换为XHTML,然后使用pugixml或类似的XML解析器解析XML。由于pugixml是一个非验证解析器,因此它也可以在不需要先运行HTML Tidy的情况下直接处理原始HTML。

    1
    如果您不介意从C++调用Python,可以使用Beautiful Soup。 至少名字是正确的!
    说真的-这是一个很好的、直接的HTML解析器。我还没有尝试从C++调用它,尽管这应该是很简单的。

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