C#使用正则表达式抓取网站信息示例
程序员文章站
2022-04-01 09:07:51
本文实例讲述了c#使用正则表达式抓取网站信息的方法。分享给大家供大家参考,具体如下:
这里以抓取京东商城商品详情为例。
1、创建jdrobber.cs程序类...
本文实例讲述了c#使用正则表达式抓取网站信息的方法。分享给大家供大家参考,具体如下:
这里以抓取京东商城商品详情为例。
1、创建jdrobber.cs程序类
public class jdrobber { /// <summary> /// 判断是否京东链接 /// </summary> /// <param name="param"></param> /// <returns></returns> public bool validationurl(string url) { bool result = false; if (!string.isnullorempty(url)) { regex regex = new regex(@"^http://item.jd.com/\d+.html$"); match match = regex.match(url); if (match.success) { result = true; } } return result; } /// <summary> /// 抓取京东信息 /// </summary> /// <param name="param"></param> /// <returns></returns> public void getinfo(string url) { if (validationurl(url)) { string htmlstr = webhandler.gethtmlstr(url, "default"); if (!string.isnullorempty(htmlstr)) { string pattern = ""; //正则表达式 string sourcewebid = ""; //商品关键id string title = ""; //标题 decimal price = 0; //价格 string picname = ""; //图片 //提取商品关键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); //提取图片 int begin = htmlstr.indexof("<div id=\"spec-n1\""); int end = htmlstr.indexof("</div>", begin + 1); if (begin > 0 && end > 0) { string subpichtml = htmlstr.substring(begin, end - begin); pattern = @"<img.*src=\""(?<object>.*?)\"".*/>"; picname = webhandler.getregextext(subpichtml, pattern); } //提取价格 if (sourcewebid != "") { string priceurl = @"http://p.3.cn/prices/get?skuid=j_" + sourcewebid + "&type=1"; string pricejson = 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> public class webhandler { /// <summary> /// 获取网页的html码 /// </summary> /// <param name="url">链接地址</param> /// <param name="encoding">编码类型</param> /// <returns></returns> public static string gethtmlstr(string url, string encoding) { string htmlstr = ""; try { if (!string.isnullorempty(url)) { webrequest request = webrequest.create(url); //实例化webrequest对象 webresponse response = request.getresponse(); //创建webresponse对象 stream datastream = response.getresponsestream(); //创建流对象 encoding ec = encoding.default; if (encoding == "utf8") { ec = encoding.utf8; } else if (encoding == "default") { ec = encoding.default; } streamreader reader = new streamreader(datastream, ec); htmlstr = reader.readtoend(); //读取数据 reader.close(); datastream.close(); response.close(); } } catch { } return htmlstr; } /// <summary> /// 获取正则表达式中的关键字 /// </summary> /// <param name="input">文本</param> /// <param name="pattern">表达式</param> /// <returns></returns> public static string getregextext(string input, string pattern) { string result = ""; if (!string.isnullorempty(input) && !string.isnullorempty(pattern)) { regex regex = new regex(pattern, regexoptions.ignorecase); match match = regex.match(input); if (match.success) { result = match.groups["object"].value; } } return result; } /// <summary> /// 返回有效价格 /// </summary> /// <param name="strprice"></param> /// <returns></returns> public static decimal getvalidprice(string strprice) { decimal price = 0; try { if (!string.isnullorempty(strprice)) { regex regex = new regex(@"^\d+(\.\d{1,2})?$", regexoptions.ignorecase); match match = regex.match(strprice); if (match.success) { price = decimal.parse(strprice); } } } catch { } return price; } }
ps:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:
javascript正则表达式在线测试工具:
正则表达式在线生成工具:
更多关于c#相关内容感兴趣的读者可查看本站专题:《c#正则表达式用法总结》、《c#编码操作技巧总结》、《c#中xml文件操作技巧汇总》、《c#常见控件用法教程》、《winform控件用法总结》、《c#数据结构与算法教程》、《c#面向对象程序设计入门教程》及《c#程序设计之线程使用技巧总结》
希望本文所述对大家c#程序设计有所帮助。