C++ C/CPP版本的BeautifulSoup,特别是在处理格式错误的HTML时

C++ C/CPP版本的BeautifulSoup,特别是在处理格式错误的HTML时,c++,html,c,html-parsing,C++,Html,C,Html Parsing,有没有关于c/cpp库的建议,可以用来轻松(尽可能多地)解析/迭代/操作HTML流/文件(假设某些流/文件可能格式不正确,例如标记未关闭等) 我只使用过这种类型的东西,但发现它非常好用。不过,我不知道它如何处理损坏的HTML。from易于使用(下面是简单的教程),即使在格式错误的HTML上也非常有效 编辑:无法再访问原始博客文章,因此我已将内容复制粘贴到此处 在C中解析(X)HTML通常被视为一项困难的任务。 的确,C语言不是开发解析器的最简单语言。 幸运的是,libxml2的模块起到了帮助作用

有没有关于c/cpp库的建议,可以用来轻松(尽可能多地)解析/迭代/操作HTML流/文件(假设某些流/文件可能格式不正确,例如标记未关闭等)

我只使用过这种类型的东西,但发现它非常好用。不过,我不知道它如何处理损坏的HTML。

from易于使用(下面是简单的教程),即使在格式错误的HTML上也非常有效

编辑:无法再访问原始博客文章,因此我已将内容复制粘贴到此处

在C中解析(X)HTML通常被视为一项困难的任务。 的确,C语言不是开发解析器的最简单语言。 幸运的是,libxml2的模块起到了帮助作用。所以,正如所承诺的,这里有一个小教程,解释如何使用libxml2的HTMLParser解析(X)HTML

首先,您需要创建一个解析器上下文。根据向解析器提供数据的方式,可以使用许多函数来实现这一点。我将使用
htmlCreatePushParserCtxt()
,因为它与内存缓冲区一起工作

htmlParserCtxtPtr parser = htmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL, 0);
然后,您可以在该解析器上下文上设置许多选项

htmlCtxtUseOptions(parser, HTML_PARSE_NOBLANKS | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING | HTML_PARSE_NONET);
我们现在可以解析(X)个HTML文档了

// char * data : buffer containing part of the web page
// int len : number of bytes in data
// Last argument is 0 if the web page isn't complete, and 1 for the final call.
htmlParseChunk(parser, data, len, 0);
在将其推送到所有数据之后,可以使用
NULL
缓冲区和
1
作为最后一个参数再次调用该函数。这将确保解析器已经处理了所有内容

最后,如何获取您解析的数据?这比看起来容易。您只需遍历创建的XML树

void walkTree(xmlNode * a_node)
{ 
    xmlNode *cur_node = NULL;
    xmlAttr *cur_attr = NULL;
    for (cur_node = a_node; cur_node; cur_node = cur_node->next)
    {
        // do something with that node information, like... printing the tag's name and attributes
        printf("Got tag : %s\n", cur_node->name)
        for (cur_attr = cur_node->properties; cur_attr; cur_attr = cur_attr->next)
        {
            printf("  ->; with attribute : %s\n", cur_attr->name);
        }
        walkTree(cur_node->children);
    }
}
walkTree(xmlDocGetRootElement(parser->myDoc));
就这样!这还不够简单吗?从那里,您可以做任何事情,比如查找所有引用的图像(通过查看
img
tag)并获取它们,或者您可以想做的任何事情

此外,您应该知道,您可以随时遍历XML树,即使您还没有解析整个(X)HTML文档

如果必须用C解析(X)个HTML,那么应该使用libxml2的
HTMLParser
。这会节省你很多时间


尝试使用SIP并在其上运行BeautifulSoup可能会有所帮助


更多关于以下链接线程的详细信息。OpenFrameworks+Python

教程的链接是broken@gidim谢谢你的报道,我已经修好了。