欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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