C++ 提取网页内容系列之四

标 题: C++ 提取网页内容系列之四
作 者: itdef
链 接: http://www.cnblogs.com/itdef/p/4173833.html

欢迎转帖 请保持文本完整并注明出处

将网页内容下载后存入字符串string 或者本地文件后 我们开始进行搜索和查询 获取信息
这里使用正则式  使用vs2008  其自带的tr1库(预备标准库) 有正则式库供使用
带头文件/*******************************************************************************
*  @file        
*  @author      def< qq group: 324164944 >
*  @blog        http://www.cnblogs.com/itdef/
*  @brief     
/*******************************************************************************/
#include <regex>
using namespace std::tr1;
using namespace std;

这里推荐正则式教程
正则表达式30分钟入门教程
http://www.cnblogs.com/deerchao/ ... zhongjiaocheng.html

C++:Regex正则表达式
http://blog.sina.com.cn/s/blog_ac9fdc0b0101oow9.html

首先来个简单例子

#include <string>
#include <iostream>
#include <regex>

using namespace std::tr1;
using namespace std;

string strContent = " onclick=\"VeryCD.TrackEvent(‘base‘, ‘首页大推‘, ‘神雕侠侣‘);";

void Test1()
{
        string strText = strContent;
        string strRegex = "首页大推";
        regex regExpress(strRegex);

        smatch ms;

        cout << "*****************************" << endl;
        cout << "Test 1" << endl << endl;

        while(regex_search(strText, ms, regExpress))
        {
                for(string::size_type i = 0;i < ms.size();++i)
                {
                        cout << ms.str(i).c_str() << endl;
                }
                strText = ms.suffix().str();
        }

        cout << "*****************************" << endl << endl;
}

void Test2()
{
        string strText = strContent;
        string strRegex = "首页大推.*‘(.*)‘";
        regex regExpress(strRegex);

        smatch ms;

        cout << "*****************************" << endl;
        cout << "Test 2" << endl << endl;
        while(regex_search(strText, ms, regExpress))
        {
                for(string::size_type i = 0;i < ms.size();++i)
                {
                        cout << ms.str(i).c_str() << endl;
                }
                strText = ms.suffix().str();
        }
        cout << "*****************************" << endl << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
        Test1();
        Test2();

        return 0;
}

Test1中 我们等于是直接搜索字符串 然后 打印出找到的位置Test2中 我们使用 首页大推.*‘(.*)‘  
.号等于是任意非空白换行字符 *则代表重复任意多次(0-无穷次)
而括号表示一个字符集 也就是我们需要查找的内容 
请注意这个括号是在 ‘ ‘  之间的  也就是查找 首页大推 任意字符之后 两个 ‘  ‘号之间的内容

效果如下:
而且我们也发现 ms的显示规律 他首先显示符合条件的字符串 然后现实符合( )里面条件的子字符串

下面来个深入点得  分析这个字符串
string strContent0 = "alt=\"火影忍者\" /><div class=\"play_ico_middle\"></div><div class=\"cv-title\" style=\"width:85px;\">更新至612集</div>";

我们使用的正则式规则为 string strRegex = "alt=\"([^\"]*)\".*width:85px;\">(.*)</div>";
注意里面有两个括号  一个是在alt= 之后 在两个" " 之间的内容  一个是在width:85px;\">  和 </div> 之间的内容 
注意  "的显示 由于C++语言的特性 必须写成 \"
现在分析两个括号内容 ([^\"]*)     (.*)

(.*)无须多说  就是任意非空白字符 而且是在width:85px;\">  和 </div> 之间的内容 
([^\"]*)  就是说 非"的内容任意重复多次  而且这个括号是在alt= 之后 在两个" " 之间的内容

运行结果如下:(为了不显示过多内容 符合条件的内容没有全部显示 只显示了符合括号需求的子字符串)

/*******************************************************************************
*  @file
*  @author      def< qq group: 324164944 >
*  @blog        http://www.cnblogs.com/itdef/
*  @brief
/*******************************************************************************/

#include <string>
#include <iostream>
#include <regex>

using namespace std::tr1;
using namespace std;

string strContent = " onclick=\"VeryCD.TrackEvent(‘base‘, ‘首页大推‘, ‘神雕侠侣‘);";

string strContent0 = "alt=\"火影忍者\" /><div class=\"play_ico_middle\"></div><div class=\"cv-title\" style=\"width:85px;\">更新至612集</div>";

void Test1()
{
        string strText = strContent;
        string strRegex = "首页大推";
        regex regExpress(strRegex);

        smatch ms;

        cout << "*****************************" << endl;
        cout << "Test 1" << endl << endl;

        while(regex_search(strText, ms, regExpress))
        {
                for(string::size_type i = 0;i < ms.size();++i)
                {
                        cout << ms.str(i).c_str() << endl;
                }
                strText = ms.suffix().str();
        }

        cout << "*****************************" << endl << endl;
}

void Test2()
{
        string strText = strContent;
        string strRegex = "首页大推.*‘(.*)‘";
        regex regExpress(strRegex);

        smatch ms;

        cout << "*****************************" << endl;
        cout << "Test 2" << endl << endl;
        while(regex_search(strText, ms, regExpress))
        {
                for(string::size_type i = 0;i < ms.size();++i)
                {
                        cout << ms.str(i).c_str() << endl;
                }
                strText = ms.suffix().str();
        }
        cout << "*****************************" << endl << endl;
}

void Test3()
{
        string strText = strContent0;
        string strRegex = "alt=\"([^\"]*)\".*width:85px;\">(.*)</div>";
        regex regExpress(strRegex);

        smatch ms;

        cout << "*****************************" << endl;
        cout << "Test 3" << endl << endl;

        while(regex_search(strText, ms, regExpress))
        {
                for(string::size_type i = 0;i < ms.size();++i)
                {
                        if(i > 0)
                                cout << ms.str(i).c_str() << endl;
                }
                strText = ms.suffix().str();
        }
        cout << "*****************************" << endl << endl;

}

int _tmain(int argc, _TCHAR* argv[])
{
        Test1();
        Test2();
        Test3();

        return 0;
}

时间: 2024-10-12 23:28:42

C++ 提取网页内容系列之四的相关文章

C++ 提取网页内容系列之三

标 题: C++ 提取网页内容系列作 者: itdef链 接: http://www.cnblogs.com/itdef/p/4171203.html 欢迎转帖 请保持文本完整并注明出处

C++ 提取网页内容系列之一

标 题: C++ 提取网页内容系列作 者: itdef链 接: http://www.cnblogs.com/itdef/p/4171179.html 欢迎转帖 请保持文本完整并注明出处 首先分析网页就要下载网页内容 这里给出了两种方案 一种是使用MFC自带函数 代码如下: int GetHttpFileData(CString strUrl,char* szDownloadHtmFileName) { CInternetSession Session("Internet Explorer&qu

C++ 提取网页内容系列之二

标 题: C++ 提取网页内容系列作 者: itdef链 接: http://www.cnblogs.com/itdef/p/4171203.html 欢迎转帖 请保持文本完整并注明出处 另外一种下载网页的内容就是使用windows sdk中的有关HTTP通讯的函数 这里使用了 www.codeproject.com 网站一位中国人封装的C++类 下载地址为http://www.codeproject.com/Articles/66625/A-Fully-Featured-Windows-HTT

XSS解决方案系列之四:关于编码

本文准备说明以下几个问题: 1. 关于重复编码的问题 2. 关于编码的多种形式的问题 3. 关于编码的几个常见问题 [说明] 本文所述编码是指encode,可以理解为转义,而不是编程序写代码. 编码或者转义机制替我们解决两个问题: a. 避免保留字冲突问题,对于web应用来说,XSS问题也是其中一类 b. 表达不可输入字符问题,比如我想在程序当中表达一个键盘上没有不可输入的字符,可以通过编码来解决. [进入正题] 1. 关于重复编码的问题: 我看了一些第三方的decoder/encoder库函数

TCP/IP网络编程系列之四(初级)

TCP/IP网络编程系列之四-基于TCP的服务端/客户端 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于流的套接字.在了解TCP之前,先了解一下TCP所属的TCP/IP协议栈. 如图所示,TCP/IP协议栈共分为4层,可以理解成数据收发分成了4个层次化过程. 链路层 它是物理链接领域标准化结果,也是最基本的领域,专门定义LAN.WAN.MAN等网络标准.若两台计算机通过网络进行数据交换,链路层就负责整个物

Sql Server来龙去脉系列之四 数据库和文件

在讨论数据库之前我们先要明白一个问题:什么是数据库? 数据库是若干对象的集合,这些对象用来控制和维护数据.一个经典的数据库实例仅仅包含少量的数据库,但用户一般也不会在一个实例上创建太多的数据库.一个数据库实例最多能创建32767个数据库,但是按照实际情况,一般设计是不会达到这个限制值. 为了更明显地说明数据库,数据库包含了以下属性和功能: *. 它是很多对象的集合,比如表.视图.存储过程.约束.对象集合的最大值是2(31) - 1(超过2百亿).一般对象的数量在几百至一万. *. 它维持拥有的用

「视频直播技术详解」系列之四:推流和传输

关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 在上一期中,我们介绍了讲解编码和封装. 本篇是<解密视频直播技术>系列之四:推流和传输.推流是直播的第一公里,直播的推流对这个直播链路影响非常大,如果推流的网络不稳定,无论我们如何做优化,观众的体验都会很糟糕.所以也是我们排查问题的第一步,如何系统地解决这类问题需要我们对相关理论有基础的认识. 本系列文章大纲如下: (一

ggplot2绘图入门系列之四:再说散点图

1 色彩和形状的控制 数据特征不仅可以用坐标来表示,也可以用不同的色彩或形状来表示.仍以mpg数据集为例,所用到的变量有cty(城市中行驶距离),hwy(高速路行驶距离),displ(排量大小),year(生产年份) 1 library(ggplot2) 2 p <- ggplot(mpg, aes(cty, hwy)) 3 p1 <- p + geom_point(aes(colour = factor(year),shape = factor(year), size = displ), a

SCCM2012 R2实战系列之四:初始化配置

在之前的文章中,我们已经完成了SCCM 2012 R2 独立主站点的部署.为了客户端代理软件的顺利安装和OSD操作系统的分发,我们需要配置组策略及DHCP服务.在本系列的第四部分,跟大家一起分享下如何去实现SCCM的初始化配置. 1. 针对计算机OU的重定向 默认情况下,所有加域的计算机会自动存放到名为"computer"的容器中,为了方便对计算机的管理,我们需要重定向,让加域的计算机自动存放在名为"CMP"的OU中. 打开Active Directory用户和计算