C#基于正则表达式实现获取网页中所有信息的网页抓取类实例
本文实例讲述了C#基于正则表达式实现获取网页中所有信息的网页抓取类。分享给大家供大家参考,具体如下:
类的代码:
usingSystem; usingSystem.Data; usingSystem.Configuration; usingSystem.Net; usingSystem.IO; usingSystem.Text; usingSystem.Collections.Generic; usingSystem.Text.RegularExpressions; usingSystem.Threading; usingSystem.Web; usingSystem.Web.UI.MobileControls; //////网页类 /// publicclassWebPage { #region私有成员 privateUrim_uri;//url privateListm_links;//此网页上的链接 privatestringm_title;//标题 privatestringm_html;//HTML代码 privatestringm_outstr;//网页可输出的纯文本 privateboolm_good;//网页是否可用 privateintm_pagesize;//网页的大小 privatestaticDictionarywebcookies=newDictionary ();//存放所有网页的Cookie #endregion #region属性 /// ///通过此属性可获得本网页的网址,只读 /// publicstringURL { get { returnm_uri.AbsoluteUri; } } //////通过此属性可获得本网页的标题,只读 /// publicstringTitle { get { if(m_title=="") { Regexreg=newRegex(@"(?m)]*>(? (?:\w|\W)*?) ]*>",RegexOptions.Multiline|RegexOptions.IgnoreCase); Matchmc=reg.Match(m_html); if(mc.Success) m_title=mc.Groups["title"].Value.Trim(); } returnm_title; } } publicstringM_html { get { if(m_html==null) { m_html=""; } returnm_html; } } //////此属性获得本网页的所有链接信息,只读 /// publicListLinks { get { if(m_links.Count==0)getLinks(); returnm_links; } } //////此属性返回本网页的全部纯文本信息,只读 /// publicstringContext { get { if(m_outstr=="")getContext(Int16.MaxValue); returnm_outstr; } } //////此属性获得本网页的大小 /// publicintPageSize { get { returnm_pagesize; } } //////此属性获得本网页的所有站内链接 /// publicListInsiteLinks { get { returngetSpecialLinksByUrl("^http://"+m_uri.Host,Int16.MaxValue); } } //////此属性表示本网页是否可用 /// publicboolIsGood { get { returnm_good; } } //////此属性表示网页的所在的网站 /// publicstringHost { get { returnm_uri.Host; } } #endregion //////从HTML代码中分析出链接信息 /// ///List privateListgetLinks() { if(m_links.Count==0) { Regex[]regex=newRegex[2]; regex[0]=newRegex(@"[^""]*).*?>(?[^<]*) ",RegexOptions.IgnoreCase|RegexOptions.Singleline); regex[1]=newRegex("<[i]*frame[^><]+src=(\"|')?(?([^>\"'\\s)])+)(\"|')?[^>]*>",RegexOptions.IgnoreCase); for(inti=0;i<2;i++) { Matchmatch=regex[i].Match(m_html); while(match.Success) { try { stringurl=HttpUtility.UrlDecode(newUri(m_uri,match.Groups["URL"].Value).AbsoluteUri); stringtext=""; if(i==0)text=newRegex("(<[^>]+>)|(\\s)|()|&|\"",RegexOptions.Multiline|RegexOptions.IgnoreCase).Replace(match.Groups["text"].Value,""); Linklink=newLink(); link.Text=text; link.NavigateUrl=url; m_links.Add(link); } catch(Exceptionex){Console.WriteLine(ex.Message);}; match=match.NextMatch(); } } } returnm_links; } /// ///此私有方法从一段HTML文本中提取出一定字数的纯文本 /// ///HTML代码 /// 提取从头数多少个字 /// 是否要链接里面的字 /// 纯文本 privatestringgetFirstNchar(stringinstr,intfirstN,boolwithLink) { if(m_outstr=="") { m_outstr=instr.Clone()asstring; m_outstr=newRegex(@"(?m)]*>",RegexOptions.Multiline|RegexOptions.IgnoreCase).Replace(m_outstr,""); m_outstr=newRegex(@"(?m)]*>",RegexOptions.Multiline|RegexOptions.IgnoreCase).Replace(m_outstr,""); m_outstr=newRegex(@"(?m)]*>",RegexOptions.Multiline|RegexOptions.IgnoreCase).Replace(m_outstr,""); if(!withLink)m_outstr=newRegex(@"(?m)]*>(\w|\W)*?]*>",RegexOptions.Multiline|RegexOptions.IgnoreCase).Replace(m_outstr,""); RegexobjReg=newSystem.Text.RegularExpressions.Regex("(<[^>]+?>)|",RegexOptions.Multiline|RegexOptions.IgnoreCase); m_outstr=objReg.Replace(m_outstr,""); RegexobjReg2=newSystem.Text.RegularExpressions.Regex("(\\s)+",RegexOptions.Multiline|RegexOptions.IgnoreCase); m_outstr=objReg2.Replace(m_outstr,""); } returnm_outstr.Length>firstN?m_outstr.Substring(0,firstN):m_outstr; } #region公有文法 //////此公有方法提取网页中一定字数的纯文本,包括链接文字 /// ///字数 /// publicstringgetContext(intfirstN) { returngetFirstNchar(m_html,firstN,true); } /// ///此公有方法从本网页的链接中提取一定数量的链接,该链接的URL满足某正则式 /// ///正则式 /// 返回的链接的个数 /// List publicListgetSpecialLinksByUrl(stringpattern,intcount) { if(m_links.Count==0)getLinks(); ListSpecialLinks=newList(); List.Enumeratori; i=m_links.GetEnumerator(); intcnt=0; while(i.MoveNext()&&cnt///此公有方法从本网页的链接中提取一定数量的链接,该链接的文字满足某正则式 /// /// 正则式 /// 返回的链接的个数 /// List publicListgetSpecialLinksByText(stringpattern,intcount) { if(m_links.Count==0)getLinks(); ListSpecialLinks=newList(); List.Enumeratori; i=m_links.GetEnumerator(); intcnt=0; while(i.MoveNext()&&cnt///这公有方法提取本网页的纯文本中满足某正则式的文字by何问起 /// /// 正则式 /// 返回文字 publicstringgetSpecialWords(stringpattern) { if(m_outstr=="")getContext(Int16.MaxValue); Regexregex=newRegex(pattern,RegexOptions.Multiline|RegexOptions.IgnoreCase); Matchmc=regex.Match(m_outstr); if(mc.Success) returnmc.Groups[1].Value; returnstring.Empty; } #endregion #region构造函数 privatevoidInit(string_url) { try { m_uri=newUri(_url); m_links=newList(); m_html=""; m_outstr=""; m_title=""; m_good=true; if(_url.EndsWith(".rar")||_url.EndsWith(".dat")||_url.EndsWith(".msi")) { m_good=false; return; } HttpWebRequestrqst=(HttpWebRequest)WebRequest.Create(m_uri); rqst.AllowAutoRedirect=true; rqst.MaximumAutomaticRedirections=3; rqst.UserAgent="Mozilla/4.0(compatible;MSIE5.01;WindowsNT5.0)"; rqst.KeepAlive=true; rqst.Timeout=10000; lock(WebPage.webcookies) { if(WebPage.webcookies.ContainsKey(m_uri.Host)) rqst.CookieContainer=WebPage.webcookies[m_uri.Host]; else { CookieContainercc=newCookieContainer(); WebPage.webcookies[m_uri.Host]=cc; rqst.CookieContainer=cc; } } HttpWebResponsersps=(HttpWebResponse)rqst.GetResponse(); Streamsm=rsps.GetResponseStream(); if(!rsps.ContentType.ToLower().StartsWith("text/")||rsps.ContentLength>1<<22) { rsps.Close(); m_good=false; return; } Encodingcding=System.Text.Encoding.Default; stringcontenttype=rsps.ContentType.ToLower(); intix=contenttype.IndexOf("charset="); if(ix!=-1) { try { cding=System.Text.Encoding.GetEncoding(rsps.ContentType.Substring(ix+"charset".Length+1)); } catch { cding=Encoding.Default; } //该处视情况而定有的需要解码 //m_html=HttpUtility.HtmlDecode(newStreamReader(sm,cding).ReadToEnd()); m_html=newStreamReader(sm,cding).ReadToEnd(); } else { //该处视情况而定有的需要解码 //m_html=HttpUtility.HtmlDecode(newStreamReader(sm,cding).ReadToEnd()); m_html=newStreamReader(sm,cding).ReadToEnd(); Regexregex=newRegex("charset=(?[^=]+)?\"",RegexOptions.IgnoreCase); stringstrcding=regex.Match(m_html).Groups["cding"].Value; try { cding=Encoding.GetEncoding(strcding); } catch { cding=Encoding.Default; } byte[]bytes=Encoding.Default.GetBytes(m_html.ToCharArray()); m_html=cding.GetString(bytes); if(m_html.Split('?').Length>100) { m_html=Encoding.Default.GetString(bytes); } } m_pagesize=m_html.Length; m_uri=rsps.ResponseUri; rsps.Close(); } catch(Exceptionex) { } } publicWebPage(string_url) { stringuurl=""; try { uurl=Uri.UnescapeDataString(_url); _url=uurl; } catch{}; Init(_url); } #endregion }
调用:
WebPagewebInfo=newWebPage("http://hovertree.net/"); webInfo.Context;//不包含html标签的所有内容 webInfo.M_html;//包含html标签的内容by何问起
PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:
JavaScript正则表达式在线测试工具:
http://tools.jb51.net/regex/javascript
正则表达式在线生成工具:
http://tools.jb51.net/regex/create_reg
更多关于C#相关内容感兴趣的读者可查看本站专题:《C#正则表达式用法总结》、《C#编码操作技巧总结》、《C#中XML文件操作技巧汇总》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》
希望本文所述对大家C#程序设计有所帮助。