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

C#抓取网页数据、分析并且去除HTML标签

 

首先将网页内容整个抓取下来,数据放在byte[]中(网络上传输时形式是byte),进一步转化为String,以便于对其操作,实例如下:

private static string GetPageData(string url)
{
    if (url == null || url.Trim() == "")
        return null;
    WebClient wc = new WebClient();
    wc.Credentials = CredentialCache.DefaultCredentials;
    Byte[] pageData = wc.DownloadData(url);
    return Encoding.Default.GetString(pageData);//.ASCII.GetString
}
  
得到了数据的字符串形式,然后可以对网页进行解析了(其实就是对字符串的各种操作和正则表达式的应用):
// 解析页面,查找链接
// 此处尚需扩展,还有某些形式的链接不被识别
string strRef = @"(href|HREF|src|SRC|action|ACTION|Action)[ ]*=[ ]*[""'][^""'#>]+[""']";
MatchCollection matches = new Regex(strRef).Matches(strResponse);
strStatus += "找到: "+matches.Count+" 个链接\r\n";

上面的例子将网页中的链接解析出来,strRef变量表示了正则表达式的模式,变量matches表示符合匹配的项目的集合,后面的Regex(strRef).Matches(strResponse)就是创建正则规则使得strResponse里符合strRef模式的字符串都返回。然后调用matches的变量就可以取得各种信息了。
当然,这里只能识别一些基本的链接形式,像script中的链接和一些不带“”的链接都没有被支持,这个的扩展还是比较简单的。

常用的的解析还有以下几种:
//获取标题
Match TitleMatch = Regex.Match(strResponse, "<title>([^<]*)</title>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
title = TitleMatch.Groups[1].Value;

//获取描述信息
Match Desc = Regex.Match(strResponse, "<Meta name=\"DESCRIPTION\" content=\"([^<]*)\">", RegexOptions.IgnoreCase | RegexOptions.Multiline);
strdesc = Desc.Groups[1].Value;

//获取网页的大小
size = strResponse.Length;

//去除Html标签

private string StripHtml(string strHtml)
{
 Regex objRegExp = new Regex("<(.|\n)+?>");
 string strOutput = objRegExp.Replace(strHtml, "");
 strOutput = strOutput.Replace("<", "&lt;");
 strOutput = strOutput.Replace(">", "&gt;");
 return strOutput;
}      
有些例外会使得去除不干净,所以建议连续两次转化。这样将Html标签转化为了空格。太多连续的空格会影响之后对字符串的操作。所以再加入这样的语句:
//把所有空格变为一个空格
Regex r = new Regex(@"\s+");
wordsOnly = r.Replace(strResponse, " ");
wordsOnly.Trim();

转载于:https://www.cnblogs.com/xiaohongwu/archive/2011/06/22/2087385.html

相关文章:

  • 漫游用户配置文件的实现方法
  • Dreamweaver入门基础与HTML视频教程
  • Java深度历险(八)——Java I/O
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • c#做外挂
  • 网络设备日常维护要求
  • SQL查询语句精华
  • LR日志输出
  • poj2080
  • C# WinForm 同程序只能运行一个
  • 关于C#中Thread.Join()的一点理解
  • VMware中Linux分辨率设置问题
  • RTEMS网络内部的同步
  • 如何才能做到网站高并发访问?
  • drbd+mysql+keepalived实现高可用测试
  • 07.Android之多媒体问题
  • css的样式优先级
  • gitlab-ci配置详解(一)
  • input的行数自动增减
  • Next.js之基础概念(二)
  • Node 版本管理
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • php的插入排序,通过双层for循环
  • 包装类对象
  • 从0实现一个tiny react(三)生命周期
  • 番外篇1:在Windows环境下安装JDK
  • 再谈express与koa的对比
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 关于Android全面屏虚拟导航栏的适配总结
  • 数据可视化之下发图实践
  • #include
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (arch)linux 转换文件编码格式
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (九)信息融合方式简介
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (三)uboot源码分析
  • (四)Android布局类型(线性布局LinearLayout)
  • (一)Neo4j下载安装以及初次使用
  • (一)基于IDEA的JAVA基础12
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)负载均衡,回话保持,cookie
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .net6使用Sejil可视化日志
  • .net操作Excel出错解决
  • ?.的用法
  • ??eclipse的安装配置问题!??
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [1525]字符统计2 (哈希)SDUT
  • [20150629]简单的加密连接.txt
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [2019/05/17]解决springboot测试List接口时JSON传参异常