Beispiel #1
0
        /// <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>());
 }
Beispiel #3
0
 public static IEnumerable <System.Text.RegularExpressions.Match> ToEnumerable(this System.Text.RegularExpressions.MatchCollection @this)
 => @this.Cast <System.Text.RegularExpressions.Match>();
Beispiel #4
0
        /// <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
        }