用htmlcxx解析从libcurl中获取到的web网页源码
来源:互联网 发布:java计算时间间隔小时 编辑:程序博客网 时间:2024/06/06 00:06
0、前言:
结合上一篇blog文,已经大体知道了如何使用libcurl来获取网页的源代码(使用libcurl获取经过gzip压缩的网页文件),下来我们在配合htmlcxx,解析用libcurl获取到的网页源代码。
1、相关源代码:
封装的libcurl的类的代码,在上一篇文章中(使用libcurl获取经过gzip压缩的网页文件);这里主要看主要部分:
// AnalysisHtml.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <string.h>#include <iostream>#include <fstream>#include "html/ParserDom.h"#include <stdlib.h>#include <stdio.h>#include "html/utils.h"#include "GetPageByURL.h"using namespace std;using namespace htmlcxx;void Init(string &page_content){GetPageByURL::Initialize();GetPageByURL::GetPageContent("http://www.fenzhi.com/", page_content);}void ClearUp(){GetPageByURL::Cleanup();}void UseHtmlCxxAnalysisHtmlStringTestCase(){//解析一段Html代码string html ="<html><body>测试文字</body></html>";//string html ="<html><body>测试文字</html>";//string html ="<html><body>测试文字</body</html>";//string html ="<html>测试文字</body></html>";HTML::ParserDom parser;tree<HTML::Node> dom = parser.parseTree(html);//输出整棵DOM树cout<< dom << endl;//输出树中所有的超链接节点tree<HTML::Node>::iterator it = dom.begin();tree<HTML::Node>::iterator end = dom.end();for(; it != end; ++it){// _stricmp()函数,在linux下用strcasecmp()函数替换if (_stricmp(it->tagName().c_str(), "A") == 0){it->parseAttributes();cout <<it->attribute("href").second << endl;}}//输出所有的文本节点it= dom.begin();end= dom.end();for(; it != end; ++it){if ((!it->isTag()) && (!it->isComment())){cout << it->text();}}cout << endl;}void UseHtmlCxxAnalysisWebPageStringTestCase(){string html;Init(html);HTML::ParserDom parser;tree<HTML::Node> dom = parser.parseTree(html);//输出整棵DOM树cout << dom << endl;ofstream zengraoli("e://zeng.txt");zengraoli << dom << endl;zengraoli.close();//输出树中所有的超链接节点tree<HTML::Node>::iterator it = dom.begin();tree<HTML::Node>::iterator end = dom.end();for(; it != end; ++it){// _stricmp()函数,在linux下用strcasecmp()函数替换if (_stricmp(it->tagName().c_str(), "A") == 0){it->parseAttributes();cout << it->attribute("href").second << endl;}}// 输出所有的文本节点it = dom.begin();end = dom.end();for(; it != end; ++it){if ((!it->isTag()) && (!it->isComment())){cout << it->text();}}cout << endl;ClearUp();}int _tmain(int argc, _TCHAR* argv[]){//UseHtmlCxxAnalysisHtmlStringTestCase();UseHtmlCxxAnalysisWebPageStringTestCase();return 0;}
2、效果:
web页面中对应的部分(一个表格):
解析出来后的样子:
3、题外话:
控制台输出乱码的原因是,使用的字符编码和解析得到的不一致的原因。
虽然htmlcxx解析dom树挺不错的,就算是标签少1个2个的也能够正确解析出来;但是要注意使用的场景,比如我要从解析到的信息得到公司的链接,那么还不如直接用正则表达式来匹配网页源代码来得快(当然这是我目前项目失败的一个原因)。
4、对应测试工程下载地址:
http://download.csdn.net/detail/zengraoli/6475093
- 用htmlcxx解析从libcurl中获取到的web网页源码
- 使用libcurl库获取网页源码
- 入门libcurl之获取网页源码
- libcurl读取网页数据到内存中
- 从网络中获取图片显示,获取网页源码
- libcurl获取网页内容的PHP代码
- libcurl获取网页
- 使用Jsoup解析从网络上获取到的html源码
- 从网页中获取源码和截取相应代码
- volley源码解析(四)--CacheDispatcher从缓存中获取数据
- volley源码解析(五)--NetworkDispatcher从网络中获取数据
- spring源码解析-从xml配置文件中获取bean
- 获取网页的源码
- 获取网页的源码
- htmlcxx 解析 html 用法
- HtmlCXX 解析html
- 使用libcurl获取经过gzip压缩的网页文件
- 使用libcurl获取经过gzip压缩的网页文件
- SoftICE入门
- 指定输入键盘码为数字
- Documentation/fault-injection/notifier-error-inject.txt
- wordpress文章ID不连续显示问题的完美解决
- NP-hard NP问题
- 用htmlcxx解析从libcurl中获取到的web网页源码
- Documentation/fault-injection/provoke-crashes.txt
- Eclipse中android插件的安装
- android 资源文件String字符串拼接
- 窗口置顶/取消置顶
- 阿里宣布11月1日起淘宝、来往、天猫等客户端将免费使用流量
- Android 2D Graphics学习(二)、Canvas篇1、Canvas基本使用
- 基于WPF的轻量型图像涂鸦程序客户端版
- java泛型之一——类泛型