/// <summary> /// 得到主要内容 的表达式 如果没有则返回空 /// 同时填充 Content ,Expression 属性 /// </summary> /// 算法说明 /// 使用XMLDocument /// 1. 使用正则表达式得到所有中文集合 , 取得所有的中文一段一段的集合 /// 2. 转换成为 正则表达式 Match的集合,方便使用Linq 计算 string GetMainContentExpression(XMLDocuentAnalyseEntity domEntity) { //主要内容 string mainContont = ""; //使用正则表达式得到所有中文集合 System.Text.RegularExpressions.MatchCollection MC = System.Text.RegularExpressions.Regex.Matches(domEntity.XmlParseConten, @"[\u4e00-\u9fa5\d\w123456789~!!·#¥%……—*()——+/”》“‘’,;。、?,:…《]+[\u4e00-\u9fa5123456789~!!·#¥%……—*(!)——+/”》“‘,’\r\n;。、?,:…《]"); //取得所有的中文一段一段的集合 //转换成为 正则表达式 Match的集合 int index = 0; var matchResluts = from x in MC.Cast <System.Text.RegularExpressions.Match>() select new MatchReslut { Match = x, Index = index++, StrinLength = x.Value.Length, //与上一个表达式相隔的位置,一个 mc 一个位置记数 space = 0 } ; //得到有有效内容的集合 List <MatchReslut> ContentTempTextarr = new List <MatchReslut>(); try { //计算出 上一个表达式相隔的位置,一个 mc 一个位置记数 matchResluts.Where(p => p.StrinLength >= TextValidLength).Aggregate((curr, next) => { ContentTempTextarr.Add(new MatchReslut { Match = next.Match, Index = next.Index, StrinLength = next.StrinLength, //与上一个表达式相隔的位置,一个 mc 一个位置记数 space = Math.Abs(next.Index - curr.Index) }); return(next); }); } //序列不包含任何异常 catch { } //如果没有找到有效的内容 可能是图片/ //需要对文字内容处理后得到的表达式对这个URL进行处理 if (ContentTempTextarr.Count() == 0) { return(""); } //填充距离 位置记数后使用Xdocument来取得文章内容 //遍历有效内容集合,对 space 距离 位置记数 进行分析 如果两个 相近的原素间 space 值过大则可能是两个不同的原素了 //对结果进行用 Space分组 List <List <MatchReslut> > groupMathResult = new List <List <MatchReslut> >(); //如果超过10 则可能需要分成不同的组了 int MaxSpace = 10; //用于添加的组 List <MatchReslut> group = new List <MatchReslut>(); //添加默认组 groupMathResult.Add(group); //将可能的文字编写方式,进行分组 ContentTempTextarr.ForEach((o) => { //需要分胡重新初始化 if (o.space > MaxSpace) { group = new List <MatchReslut>(); groupMathResult.Add(group); } group.Add(o); }); //取出结果最多的那个组做为有效内容的 集合进行提取 //找到有效的原素 var ValidMathes = groupMathResult.OrderByDescending(p => p.Count).ElementAt(0); //通过有效值生成动态数表达式 List <string> regStr = new List <string>(); ValidMathes.ForEach((o) => { if (o != ValidMathes.Last()) { regStr.Add(o.Match.Value + @"[\w\W]+"); } else { regStr.Add(o.Match.Value); } }); //提取数据 mainContont = System.Text.RegularExpressions.Regex.Match(domEntity.XmlParseConten, string.Join("", regStr.ToArray())).Value; #region 开始查找包含这些内容的最内层的原素 HtmlDocument htmldom = new HtmlDocument(); htmldom.LoadHtml(domEntity.OriginContent); List <HtmlNode> htmlNodes = new List <HtmlNode>(); // 遍历所有HTML原素 EachAllHTMLElelents(htmldom.DocumentNode, htmlNodes, tong.ForMatTextReplaceHTMLTags(mainContont).Replace("\r", "").Replace("\n", "").Replace("\t", "").Replace(" ", "")); if (htmlNodes.Count > 0) { var Mainel = htmlNodes.Last(); //设置内容 domEntity.Content = Mainel.InnerHtml; //指表达式 domEntity.Expression = Mainel.XPath; //返回path表达式 return(Mainel.XPath); } return(""); #endregion }
public static IEnumerable <System.Text.RegularExpressions.Match> AsEnumerable(this System.Text.RegularExpressions.MatchCollection source) { TypeCheckEnumerable(source, (s) => s.AsEnumerable(), (s) => s[0]); return(source.Cast <System.Text.RegularExpressions.Match>()); }
public static IEnumerable <System.Text.RegularExpressions.Match> ToEnumerable(this System.Text.RegularExpressions.MatchCollection @this) => @this.Cast <System.Text.RegularExpressions.Match>();
/// <summary> /// 得到主要内容 的表达式 如果没有则返回空 /// 同时填充 Content ,Expression 属性 /// </summary> /// 算法说明 /// 使用XMLDocument /// 1. 使用正则表达式得到所有中文集合 , 取得所有的中文一段一段的集合 /// 2. 转换成为 正则表达式 Match的集合,方便使用Linq 计算 string GetMainContentExpression(XMLDocuentAnalyseEntity domEntity) { //主要内容 string mainContont = ""; //使用正则表达式得到所有中文集合 System.Text.RegularExpressions.MatchCollection MC = System.Text.RegularExpressions.Regex.Matches(domEntity.XmlParseConten, @"[\u4e00-\u9fa5\d\w123456789~!!·#¥%……—*()——+/”》“‘’,;。、?,:…《]+[\u4e00-\u9fa5123456789~!!·#¥%……—*(!)——+/”》“‘,’\r\n;。、?,:…《]"); //取得所有的中文一段一段的集合 //转换成为 正则表达式 Match的集合 int index = 0; var matchResluts = from x in MC.Cast <System.Text.RegularExpressions.Match>() select new MatchReslut { Match = x, Index = index++, StrinLength = x.Value.Length, //与上一个表达式相隔的位置,一个 mc 一个位置记数 space = 0 } ; //得到有有效内容的集合 List <MatchReslut> ContentTempTextarr = new List <MatchReslut>(); if (MC.Count > 0) { try { //计算出 上一个表达式相隔的位置,一个 mc 一个位置记数 var list = matchResluts.Where(p => p.StrinLength >= TextValidLength); if (list.Count() > 0) { list.Aggregate((curr, next) => { ContentTempTextarr.Add(new MatchReslut { Match = next.Match, Index = next.Index, StrinLength = next.StrinLength, //与上一个表达式相隔的位置,一个 mc 一个位置记数 space = Math.Abs(next.Index - curr.Index) }); return(next); }); } } //序列不包含任何异常 catch (Exception ex) { System.Diagnostics.Debug.WriteLine(DateTime.Now + ex.Message + "|||||" + ex.StackTrace); } } //如果没有找到有效的内容 可能是图片/ //需要对文字内容处理后得到的表达式对这个URL进行处理 if (ContentTempTextarr.Count == 0) { return(""); } //填充距离 位置记数后使用Xdocument来取得文章内容 //遍历有效内容集合,对 space 距离 位置记数 进行分析 如果两个 相近的原素间 space 值过大则可能是两个不同的原素了 //对结果进行用 Space分组 List <List <MatchReslut> > groupMathResult = new List <List <MatchReslut> >(); //如果超过10 则可能需要分成不同的组了 int MaxSpace = 10; //用于添加的组 List <MatchReslut> group = new List <MatchReslut>(); //添加默认组 groupMathResult.Add(group); //将可能的文字编写方式,进行分组 ContentTempTextarr.ForEach((o) => { //需要分胡重新初始化 if (o.space > MaxSpace) { group = new List <MatchReslut>(); groupMathResult.Add(group); } group.Add(o); }); //取出结果最多的那个组做为有效内容的 集合进行提取 //找到有效的原素 var ValidMathes = groupMathResult.OrderByDescending(p => p.Count).ElementAt(0); //通过有效值生成动态数表达式 List <string> regStr = new List <string>(); ValidMathes.ForEach((o) => { if (o != ValidMathes.Last()) { regStr.Add(o.Match.Value + @"[\w\W]+"); } else { regStr.Add(o.Match.Value); } }); //提取数据 //mainContont = System.Text.RegularExpressions.Regex.Match(domEntity.XmlParseConten, string.Join("", regStr.ToArray())).Value; #region 正则表达式线程CPU 100% 优化方法 //放在一个线程里,如果超过3秒线程还没有执行完成则直接关闭线程 //这样可以保证CPU100%的情况得到改善 System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(() => { try { //提取数据 mainContont = System.Text.RegularExpressions.Regex.Match(domEntity.XmlParseConten, string.Join("", regStr.ToArray())).Value; } catch (OutOfMemoryException ex) { System.Diagnostics.Debug.WriteLine(DateTime.Now + "提取数据" + ex.Message + "|||||" + ex.StackTrace); } })); thread.Start(); //task只是做一个等待器 System.Threading.Tasks.Task task = new System.Threading.Tasks.Task(() => { }); //如果3秒还没有分析出来正则表达式结果 if (!task.Wait(1000 * 3) && string.IsNullOrEmpty(mainContont)) { thread.Abort(); return(mainContont); } #endregion #region 开始查找包含这些内容的最内层的原素 HtmlDocument htmldom = new HtmlDocument(); htmldom.LoadHtml(domEntity.OriginContent); List <HtmlNode> htmlNodes = new List <HtmlNode>(); // 遍历所有HTML原素 EachAllHTMLElelents(htmldom.DocumentNode, htmlNodes, tong.ForMatTextReplaceHTMLTags(mainContont).Replace("\r", "").Replace("\n", "").Replace("\t", "").Replace(" ", "")); if (htmlNodes.Count > 0) { var Mainel = htmlNodes.Last(); //设置内容 domEntity.Content = Mainel.InnerHtml; //指表达式 domEntity.Expression = Mainel.XPath; //清空变量 htmlNodes.Clear(); htmldom.DocumentNode.InnerHtml = string.Empty; //返回path表达式 return(Mainel.XPath); } //清空变量 htmlNodes.Clear(); htmldom.DocumentNode.InnerHtml = string.Empty; return(""); #endregion }