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#程序设计有所帮助。