前言
想找到一个c++的html解析库,网上浏览了一下,原本想用google的gumbo + gumbo-query,但是编译始终报错,我在ubuntu16.04和18.04上都做了尝试,几天也解决不了后,决定找其他的库。然后就找到了Modest
介绍:Modest包含了myhtml和mycss,其中myhtml没有任何外部依赖关系,mycss依赖myhtml项目。如果没有特殊的情况,直接下载Modest就好了。里面包含了myhtml和mycss的东西。
编译:下载后,按照INSTALL.md指引就好了
make
sudo make install prefix=/usr/local/
查看官方例子
解析html的步骤1必备
// basic init
myhtml_t* myhtml = myhtml_create();
myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0);
// init tree
myhtml_tree_t* tree = myhtml_tree_create();
myhtml_tree_init(tree, myhtml);
// parse html
myhtml_parse(tree, MyENCODING_UTF_8, response.c_str(), strlen(response.c_str()));
2.1输出解析结果:head、body等
myhtml_serialization_tree_callback(tree->node_head,serialization_callback,NULL); //head
myhtml_serialization_tree_callback(tree->node_body,serialization_callback,NULL); //body
myhtml_serialization_tree_callback(tree->node_form,serialization_callback,NULL); //表单
myhtml_serialization_tree_callback(tree->node_html,serialization_callback,NULL); //html
2.2输出解析结果:只输出某类标签属性
修改myhtml_get_nodes_by_tag_id中的第三个参数获取对应的属性
// get and print
myhtml_collection_t *titles_list = myhtml_get_nodes_by_tag_id(tree, NULL, MyHTML_TAG_A, NULL);
myhtml_serialization_node_callback(collection_first->list[0],serialization_callback,NULL);
}
解析结果,其实在这里回调触发了多次,才输出完一个标签的信息
获取全部解析结果print_found_result("Result", tree,titles_list);
void print_found_result(const char* caption, myhtml_tree_t* html_tree, myhtml_collection_t *collection)
{
if(collection) {
printf("%s:\n", caption);
for(size_t i = 0; i < collection->length; i++) {
printf("\t\n\n");
myhtml_serialization_node_callback(collection->list[i], serialization_callback, NULL);
}
printf("\n");
}
else {
printf("%s: empty\n", caption);
}
通过回调获取到筛选出来的属性
mystatus_t serialization_callback(const char* data, size_t len, void* ctx)
{
printf("%.*s", (int)len, data);
return MyCORE_STATUS_OK;
}
返回结果