C#使用正则表达式抓取网站信息示例
本文实例讲述了C#使用正则表达式抓取网站信息的方法。分享给大家供大家参考,具体如下:
这里以抓取京东商城商品详情为例。
1、创建JdRobber.cs程序类
publicclassJdRobber { ///<summary> ///判断是否京东链接 ///</summary> ///<paramname="param"></param> ///<returns></returns> publicboolValidationUrl(stringurl) { boolresult=false; if(!String.IsNullOrEmpty(url)) { Regexregex=newRegex(@"^http://item.jd.com/\d+.html$"); Matchmatch=regex.Match(url); if(match.Success) { result=true; } } returnresult; } ///<summary> ///抓取京东信息 ///</summary> ///<paramname="param"></param> ///<returns></returns> publicvoidGetInfo(stringurl) { if(ValidationUrl(url)) { stringhtmlStr=WebHandler.GetHtmlStr(url,"Default"); if(!String.IsNullOrEmpty(htmlStr)) { stringpattern="";//正则表达式 stringsourceWebID="";//商品关键ID stringtitle="";//标题 decimalprice=0;//价格 stringpicName="";//图片 //提取商品关键ID pattern=@"http://item.jd.com/(?<Object>\d+).html"; sourceWebID=WebHandler.GetRegexText(url,pattern); //提取标题 pattern=@"<div.*id=\""name\"".*>[\s\S]*<h1>(?<Object>.*?)</h1>"; title=WebHandler.GetRegexText(htmlStr,pattern); //提取图片 intbegin=htmlStr.IndexOf("<divid=\"spec-n1\""); intend=htmlStr.IndexOf("</div>",begin+1); if(begin>0&&end>0) { stringsubPicHtml=htmlStr.Substring(begin,end-begin); pattern=@"<img.*src=\""(?<Object>.*?)\"".*/>"; picName=WebHandler.GetRegexText(subPicHtml,pattern); } //提取价格 if(sourceWebID!="") { stringpriceUrl=@"http://p.3.cn/prices/get?skuid=J_"+sourceWebID+"&type=1"; stringpriceJson=WebHandler.GetHtmlStr(priceUrl,"Default"); pattern=@"\""p\"":\""(?<Object>\d+(\.\d{1,2})?)\"""; price=WebHandler.GetValidPrice(WebHandler.GetRegexText(priceJson,pattern)); } Console.WriteLine("商品名称:{0}",title); Console.WriteLine("图片:{0}",picName); Console.WriteLine("价格:{0}",price); } } } }
2、创建WebHandler.cs公共方法类
///<summary> ///公共方法类 ///</summary> publicclassWebHandler { ///<summary> ///获取网页的HTML码 ///</summary> ///<paramname="url">链接地址</param> ///<paramname="encoding">编码类型</param> ///<returns></returns> publicstaticstringGetHtmlStr(stringurl,stringencoding) { stringhtmlStr=""; try { if(!String.IsNullOrEmpty(url)) { WebRequestrequest=WebRequest.Create(url);//实例化WebRequest对象 WebResponseresponse=request.GetResponse();//创建WebResponse对象 Streamdatastream=response.GetResponseStream();//创建流对象 Encodingec=Encoding.Default; if(encoding=="UTF8") { ec=Encoding.UTF8; } elseif(encoding=="Default") { ec=Encoding.Default; } StreamReaderreader=newStreamReader(datastream,ec); htmlStr=reader.ReadToEnd();//读取数据 reader.Close(); datastream.Close(); response.Close(); } } catch{} returnhtmlStr; } ///<summary> ///获取正则表达式中的关键字 ///</summary> ///<paramname="input">文本</param> ///<paramname="pattern">表达式</param> ///<returns></returns> publicstaticstringGetRegexText(stringinput,stringpattern) { stringresult=""; if(!String.IsNullOrEmpty(input)&&!String.IsNullOrEmpty(pattern)) { Regexregex=newRegex(pattern,RegexOptions.IgnoreCase); Matchmatch=regex.Match(input); if(match.Success) { result=match.Groups["Object"].Value; } } returnresult; } ///<summary> ///返回有效价格 ///</summary> ///<paramname="strPrice"></param> ///<returns></returns> publicstaticdecimalGetValidPrice(stringstrPrice) { decimalprice=0; try { if(!String.IsNullOrEmpty(strPrice)) { Regexregex=newRegex(@"^\d+(\.\d{1,2})?$",RegexOptions.IgnoreCase); Matchmatch=regex.Match(strPrice); if(match.Success) { price=decimal.Parse(strPrice); } } } catch{} returnprice; } }
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#程序设计有所帮助。