当前位置: 首页 > news >正文

如何分析网页数据并且去除Html标签(C#)

首先将网页内容整个抓取下来,这个我就不说了,不是本次话题的重点。假设抓取的数据放在RecvBuffer这个 byte[]中(数据从网络上传输过来时不是字符串的形式而是byte),那么我们的第一步就是将RecvBuffer转化为String,以便于对其操作,实例如下:
None.gif    //  将接收到的数据增加到响应字符串中
None.gif
  strResponse  +=  Encoding.ASCII.GetString(RecvBuffer,  0 , nBytes);
      strResponse即是保存数据的字符串,此处用系统自带的System.Text.Encoding的方法转化RecvBuffer,GetString的第一个参数RecvBuffer就是我们的原始数据,即包含需要解码的字节序列的字节数组;第二个参数0代表第一个要解码的字节的索引,一般就从0开始;第三个参数nBytes为要解码的字节数,可以自己调整。

      得到了数据的字符串形式,然后可以对网页进行解析了(其实就是对字符串的各种操作和正则表达式的应用)。下面我以几个例子来说明对网页数据的解析:
None.gif    //  解析页面,查找链接
None.gif  
//  此处尚需扩展,还有某些形式的链接不被识别
None.gif
   string  strRef  =   @" (href|HREF|src|SRC|action|ACTION|Action)[ ]*=[ ]*[""'][^""'#>]+[""'] " ;
None.gif  MatchCollection matches 
=   new  Regex(strRef).Matches(strResponse);
None.gif  strStatus 
+=   " 找到:  " + matches.Count + "  个链接\r\n " ;
      上面的例子将网页中的链接解析出来,strRef变量表示了正则表达式的模式,变量matches表示符合匹配的项目的集合,后面的Regex(strRef).Matches(strResponse)就是创建正则规则使得strResponse里符合strRef模式的字符串都返回。然后调用matches的变量就可以取得各种信息了。
      当然,这里只能识别一些基本的链接形式,像script中的链接和一些不带“”的链接都没有被支持,这个的扩展还是蛮简单的。
      再举几个更简单点的解析的例子,大家学习学习:
None.gif    // 获取标题
None.gif
  Match TitleMatch  =  Regex.Match(strResponse,  " <title>([^<]*)</title> " , RegexOptions.IgnoreCase  |  RegexOptions.Multiline);
None.gif  title 
=  TitleMatch.Groups[ 1 ].Value;
None.gif
None.gif  
// 获取描述信息
None.gif
  Match Desc  =  Regex.Match(strResponse,  " <Meta name=\ " DESCRIPTION\ "  content=\ " ([ ^< ] * )\ " > " , RegexOptions.IgnoreCase  |  RegexOptions.Multiline);
None.gif  strdesc 
=  Desc.Groups[ 1 ].Value;
None.gif
None.gif  
// 获取网页的大小
None.gif
  size  =  strResponse.Length;

—————————————————————割—————————————————————————

      好了,下面说一下如何去除Html标签,这个想必有很多初学者很需要。其实还是正则表达式和字符串基本操作的应用,由于这个功能还是比较常用的,所以例子写成了函数,便于调用:
ExpandedBlockStart.gif ContractedBlock.gif    /**/ /// <summary>
InBlock.gif  
/// 将Html标签转化为空格
InBlock.gif  
/// </summary>
InBlock.gif  
/// <param name="strHtml">待转化的字符串</param>
ExpandedBlockEnd.gif  
/// <returns>经过转化的字符串</returns>

None.gif    private   string  stripHtml( string  strHtml)
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif {
InBlock.gif     Regex objRegExp 
= new Regex("<(.|\n)+?>");
InBlock.gif     
string strOutput = objRegExp.Replace(strHtml, "");
InBlock.gif     strOutput 
= strOutput.Replace("<""&lt;");
InBlock.gif     strOutput 
= strOutput.Replace(">""&gt;");
InBlock.gif     
return strOutput;
ExpandedBlockEnd.gif  }
      ok,这样一来Html标签就基本没了,但是有些例外会使得去除不干净,所以建议连续两次转化,这样就搞定了。但是还没结束,如果你留意的话,可以看到上面的函数其实是将Html标签转化为了空格。太多连续的空格会影响之后对字符串的操作。所以再加入这样的语句:
None.gif    // 把所有空格变为一个空格
None.gif
  Regex r  =   new  Regex( @" \s+ " );
None.gif  wordsOnly 
=  r.Replace(strResponse,  "   " );
None.gif  wordsOnly.Trim();

转载于:https://www.cnblogs.com/hzuIT/articles/751805.html

相关文章:

  • win7下 启动virtualbox时 创建com对象失败 应用程序即将被中断 解决方案
  • 给DLL打上版本号
  • Activity生命周期
  • 加入域,找不到网络路径的解决办法
  • 跟你分享一下养生的经验
  • Java UDP 示例
  • Exchange Server 2003邮件服务器系统的基本部署思路
  • HTTP请求头详解【转】
  • 2007-5-30
  • apache下ab.exe使用方法。。
  • 最常用的20个ASP代码片段 上
  • 如何快速解救野外被困人员
  • ASP.NET DEMO Ⅳ : 使用数据源控件将数据绑定到 ListControl 上
  • java synth实例
  • 心理年龄测试:准专业的心理年龄鉴定测试
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • CSS 专业技巧
  • css布局,左右固定中间自适应实现
  • Effective Java 笔记(一)
  • es6
  • ES6核心特性
  • github从入门到放弃(1)
  • IDEA常用插件整理
  • IndexedDB
  • java8-模拟hadoop
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 从零开始在ubuntu上搭建node开发环境
  • 动态规划入门(以爬楼梯为例)
  • 首页查询功能的一次实现过程
  • 线性表及其算法(java实现)
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 1.Ext JS 建立web开发工程
  • AI算硅基生命吗,为什么?
  • ionic入门之数据绑定显示-1
  • 阿里云API、SDK和CLI应用实践方案
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #数据结构 笔记三
  • $jQuery 重写Alert样式方法
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)shell调试方法
  • (转)重识new
  • .Net CF下精确的计时器
  • .Net Core中Quartz的使用方法
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET 设计一套高性能的弱事件机制
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .net6+aspose.words导出word并转pdf