架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 66|回复: 1

[资料] C#获取HTML文本的第一张图片与截取内容摘要示例代码

[复制链接]
跳转到指定楼层
楼主
发表于 2019-8-8 09:44:41
zu
获取第一张图片

要我们获得到的数据是一段HTML文本、也许这段文本里面有许多图片、需要截取一张作为标题图片、也就是做为主图、这时就可以用到下面这个方法获取到第一张图片。

示例代码

  1. #region 获取第一张图片

  2.         /// <summary>
  3.         /// 获取HTML文本的图片地址
  4.         /// </summary>
  5.         /// <param name="content"></param>
  6.         /// <returns></returns>/
  7.         ///
  8.         public ArrayList getimgurl(string html)
  9.         {
  10.             ArrayList resultStr = new ArrayList();
  11.             Regex r = new Regex(@"<IMG[^>]+src=\s*(?:'(?<src>[^']+)'|""(?<src>[^""]+)""|(?<src>[^>\s]+))\s*[^>]*>", RegexOptions.IgnoreCase);//忽视大小写
  12.             MatchCollection mc = r.Matches(html);

  13.             foreach (Match m in mc)
  14.             {
  15.                 resultStr.Add(m.Groups["src"].Value.ToLower());
  16.             }
  17.             if (resultStr.Count > 0)
  18.             {
  19.                 return resultStr;
  20.             }
  21.             else
  22.             {
  23.                 resultStr.Clear();
  24.                 return resultStr;
  25.             }
  26.         }
  27.         #endregion
复制代码


注意:上面所返回的是一个ArrayList 集合、包含了文本里面所有的Img的src、这样我们就可以访问到img的src了

截取HTML文本

有时候我们得到的数据是一段HTML文本、需要截取HTML文本的一部分作为内容摘要、此时、我们可以运用下面这个方法

示例代码

  1. #region 新闻内容摘要

  2.         /// <summary>
  3.         /// 新闻内容摘要
  4.         /// </summary>
  5.         /// <param name="sString"></param>
  6.         /// <param name="nLeng"></param>
  7.         /// <returns></returns>
  8.         public string GetContentSummary(string content, int length, bool StripHTML)
  9.         {
  10.             if (string.IsNullOrEmpty(content) || length == 0)
  11.                 return "";
  12.             if (StripHTML)
  13.             {
  14.                 Regex re = new Regex("<[^>]*>");
  15.                 content = re.Replace(content, "");
  16.                 content = content.Replace(" ", "").Replace(" ", "");
  17.                 if (content.Length <= length)
  18.                     return content;
  19.                 else
  20.                     return content.Substring(0, length) + "……";
  21.             }
  22.             else
  23.             {
  24.                 if (content.Length <= length)
  25.                     return content;

  26.                 int pos = 0, npos = 0, size = 0;
  27.                 bool firststop = false, notr = false, noli = false;
  28.                 StringBuilder sb = new StringBuilder();
  29.                 while (true)
  30.                 {
  31.                     if (pos >= content.Length)
  32.                         break;
  33.                     string cur = content.Substring(pos, 1);
  34.                     if (cur == "<")
  35.                     {
  36.                         string next = content.Substring(pos + 1, 3).ToLower();
  37.                         if (next.IndexOf("p") == 0 && next.IndexOf("pre") != 0)
  38.                         {
  39.                             npos = content.IndexOf(">", pos) + 1;
  40.                         }
  41.                         else if (next.IndexOf("/p") == 0 && next.IndexOf("/pr") != 0)
  42.                         {
  43.                             npos = content.IndexOf(">", pos) + 1;
  44.                             if (size < length)
  45.                                 sb.Append("<br/>");
  46.                         }
  47.                         else if (next.IndexOf("br") == 0)
  48.                         {
  49.                             npos = content.IndexOf(">", pos) + 1;
  50.                             if (size < length)
  51.                                 sb.Append("<br/>");
  52.                         }
  53.                         else if (next.IndexOf("img") == 0)
  54.                         {
  55.                             npos = content.IndexOf(">", pos) + 1;
  56.                             if (size < length)
  57.                             {
  58.                                 sb.Append(content.Substring(pos, npos - pos));
  59.                                 size += npos - pos + 1;
  60.                             }
  61.                         }
  62.                         else if (next.IndexOf("li") == 0 || next.IndexOf("/li") == 0)
  63.                         {
  64.                             npos = content.IndexOf(">", pos) + 1;
  65.                             if (size < length)
  66.                             {
  67.                                 sb.Append(content.Substring(pos, npos - pos));
  68.                             }
  69.                             else
  70.                             {
  71.                                 if (!noli && next.IndexOf("/li") == 0)
  72.                                 {
  73.                                     sb.Append(content.Substring(pos, npos - pos));
  74.                                     noli = true;
  75.                                 }
  76.                             }
  77.                         }
  78.                         else if (next.IndexOf("tr") == 0 || next.IndexOf("/tr") == 0)
  79.                         {
  80.                             npos = content.IndexOf(">", pos) + 1;
  81.                             if (size < length)
  82.                             {
  83.                                 sb.Append(content.Substring(pos, npos - pos));
  84.                             }
  85.                             else
  86.                             {
  87.                                 if (!notr && next.IndexOf("/tr") == 0)
  88.                                 {
  89.                                     sb.Append(content.Substring(pos, npos - pos));
  90.                                     notr = true;
  91.                                 }
  92.                             }
  93.                         }
  94.                         else if (next.IndexOf("td") == 0 || next.IndexOf("/td") == 0)
  95.                         {
  96.                             npos = content.IndexOf(">", pos) + 1;
  97.                             if (size < length)
  98.                             {
  99.                                 sb.Append(content.Substring(pos, npos - pos));
  100.                             }
  101.                             else
  102.                             {
  103.                                 if (!notr)
  104.                                 {
  105.                                     sb.Append(content.Substring(pos, npos - pos));
  106.                                 }
  107.                             }
  108.                         }
  109.                         else
  110.                         {
  111.                             npos = content.IndexOf(">", pos) + 1;
  112.                             sb.Append(content.Substring(pos, npos - pos));
  113.                         }
  114.                         if (npos <= pos)
  115.                             npos = pos + 1;
  116.                         pos = npos;
  117.                     }
  118.                     else
  119.                     {
  120.                         if (size < length)
  121.                         {
  122.                             sb.Append(cur);
  123.                             size++;
  124.                         }
  125.                         else
  126.                         {
  127.                             if (!firststop)
  128.                             {
  129.                                 sb.Append("……");
  130.                                 firststop = true;
  131.                             }
  132.                         }
  133.                         pos++;
  134.                     }

  135.                 }
  136.                 return sb.ToString();
  137.             }
  138.         }
  139.         #endregion
复制代码


总结

以上就是利用C#获取一段HTML文本中的第一张图片和截取内容摘要的全部内容,希望本文的内容对大家学习或者使用C#能有所帮助。





上一篇:分享网易云课堂《Excel办公自动化—VBA(宏)》
下一篇:.netcore wwwroot目录
帖子永久地址: 

架构师_程序员 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与架构师_程序员享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和架构师_程序员的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、架构师_程序员管理员和版主有权不事先通知发贴者而删除本文

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
沙发
 楼主| 发表于 2019-8-8 10:00:56
截取指定长度html内容,并保留html格式标记(c#版)

  1. /// <summary>
  2.     /// 按字节长度截取字符串(支持截取带HTML代码样式的字符串)
  3.     /// </summary>
  4.     /// <param name=”param”>将要截取的字符串参数</param>
  5.     /// <param name=”length”>截取的字节长度</param>
  6.     /// <param name=”end”>字符串末尾补上的字符串</param>
  7.     /// <returns>返回截取后的字符串</returns>
  8.     public string SubstringToHTML(string param, int length, string end)
  9.     {
  10.         string Pattern = null;
  11.         MatchCollection m = null;
  12.         StringBuilder result = new StringBuilder();
  13.         int n = 0;
  14.         char temp;
  15.         bool isCode = false; //是不是HTML代码
  16.         bool isHTML = false; //是不是HTML特殊字符,如&nbsp;
  17.         char[] pchar = param.ToCharArray();
  18.         for (int i = 0; i < pchar.Length; i++)
  19.         {
  20.             temp = pchar[i];
  21.             if (temp == ‘<’)
  22.             {
  23.                 isCode = true;
  24.             }
  25.             else if (temp == ‘&’)
  26.             {
  27.                 isHTML = true;
  28.             }
  29.             else if (temp == ‘>’ && isCode)
  30.             {
  31.                 n = n – 1;
  32.                 isCode = false;
  33.             }
  34.             else if (temp == ‘;’ && isHTML)
  35.             {
  36.                 isHTML = false;
  37.             }

  38.             if (!isCode && !isHTML)
  39.             {
  40.                 n = n + 1;
  41.                 //UNICODE码字符占两个字节
  42.                 if (System.Text.Encoding.Default.GetBytes(temp + “”).Length > 1)
  43.                 {
  44.                     n = n + 1;
  45.                 }
  46.             }

  47.             result.Append(temp);
  48.             if (n >= length)
  49.             {
  50.                 break;
  51.             }
  52.         }
  53.         result.Append(end);
  54.         //取出截取字符串中的HTML标记
  55.         string temp_result = result.ToString().Replace(“(>)[^<>]*(<?)”, “$1$2″);
  56.         //去掉不需要结素标记的HTML标记
  57.         temp_result = temp_result.Replace(@”</?(AREA|BASE|BASEFONT|BODY|BR|COL|COLGROUP|DD|DT|FRAME|HEAD|HR|HTML

  58. |IMG|INPUT|ISINDEX|LI|LINK|META|OPTION|P|PARAM|TBODY|TD|TFOOT|TH|THEAD

  59. |TR|area|base|basefont|body|br|col|colgroup|dd|dt|frame|head|hr|html|img|input|isindex|li|link|meta

  60. |option|p|param|tbody|td|tfoot|th|thead|tr)[^<>]*/?>”,
  61.          “”);
  62.         //去掉成对的HTML标记
  63.         temp_result = temp_result.Replace(@”<([a-zA-Z]+)[^<>]*>(.*?)</1>”, “$2″);
  64.         //用正则表达式取出标记
  65.         Pattern = (“<([a-zA-Z]+)[^<>]*>”);
  66.         m = Regex.Matches(temp_result, Pattern);
  67.         ArrayList endHTML = new ArrayList();
  68.         foreach (Match mt in m)
  69.         {
  70.             endHTML.Add(mt.Result(“$1″));
  71.         }
  72.         //补全不成对的HTML标记
  73.         for (int i = endHTML.Count – 1; i >= 0; i–)
  74.         {
  75.             result.Append(“</”);
  76.             result.Append(endHTML[i]);
  77.             result.Append(“>”);
  78.         }
  79.         return result.ToString();
  80.     }
复制代码
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2019-8-18 17:42

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表