网页提取数据常用正则

匹配HTML标签

<TAG\b[^> ]*>(.*?)</ TAG> **相匹配的开放和关闭对一个特定的HTML标记。标记之间的任何捕捉到的第一个反向引用 。在正则表达式的问号,使明星懒,以确保它停止之前的第一个结束标记,而不是在最后,像一个贪婪的明星会做。这个正则表达式将无法正确匹配自己一样,<TAG>one<TAG>two</TAG>one</TAG>.

<([AZ] [A - Z0 - 9] *)\ B [^>]*>(.*?)</ \ 1> 将匹配的开幕式和闭幕式对任何HTML标记 。一定要关闭的大小写。在此解决方案的关键是在正则表达式的使用反向 引用\ 1 。标记之间的任何捕获到第二个逆向引用 。该解决方案还将不匹配嵌套标记本身。

<TAG[^>]*>(.*?)</TAG>

选项​​:点匹配换行符;不区分大小写

<([A-Z][A-Z0-9]*)[^>]*>(.*?)</\1>

选项​​:点匹配换行符;不区分大小写

修剪空白

您可以轻松地修剪从一开始就和不必要的空白字符串的结尾或在一个文本文件的行,做一个正则表达式搜索和替换。搜索^ [\ t]+ 分析与RegexBuddy的正则表达式和替换删除前导空格(空格和制表符)无关。搜索[\ T + $ 修剪尾随空白。不要都将结合正则表达式^ [\ T] + | [\ T + $ 。而不是[\ T]匹配一个空格或制表符,可以扩大到的字符类[\ T \ R \ N ]如果你也想去掉换行符 。或者你也可以使用速记 \ S

前导空格

^[ \t]+

选项​​:^和$匹配换行符

尾随空白

[ \t]+$

选项​​:^和$匹配换行符

#region 获得字符串中开始和结束字符串中间得值
        /// <summary>
        /// 获得字符串中开始和结束字符串中间得值
        /// </summary>
        /// <param name="begin">开始匹配标记</param>
        /// <param name="end">结束匹配标记</param>
        /// <param name="html">Html字符串</param>
        /// <returns>返回中间字符串</returns>
        public static MatchCollection GetMidValue(string begin, string end, string html)
        {
            Regex reg = new Regex("(?<=(" + begin + "))[.\\s\\S]*?(?=(" + end + "))", RegexOptions.Multiline | RegexOptions.Singleline);
            return reg.Matches(html);
        }
        #endregion



  


/// <summary> 
        /// 获得字符串中开始和结束字符串中间得值 
        /// </summary> 
        /// <param name="str"></param> 
        /// <param name="s">开始</param> 
        /// <param name="e">结束</param> 
        /// <returns></returns> 
        private string getvalue(string str, string start, string end) 
        {
            Regex rg = new Regex("(?<=(" + start + "))[.\\s\\S]*?(?=(" + end + "))", RegexOptions.Multiline | RegexOptions.Singleline); 

            return rg.Match(str).Value;            
        }

//正则抽取单个Table , 可根据table内的某个标识字符, good !

如果仅仅是以“会员资料”这样的做为参考标识,用我上面写的稍稍改造就可以了,问题的复杂在于,如果以“00”或者“444”做为参考标识,就要考虑到<table>标签嵌套的问题,既要保证取包含参考标识的最内层<table>,又要保证<table></table>配对匹配

Match mm = Regex.Match(html, @"<table[^>]*>(((<table[^>]*>(?<o>)|</table>(?<-o>)|(?!</?table)[\s\S])*)(?(o)(?!)))\b" + "会员资料" + @"\b(?:(?!<table[^>]*>)[\s\S])*?(((<table[^>]*>(?<o>)|</table>(?<-o>)|(?!</?table)[\s\S])*)(?(o)(?!)))</table>", RegexOptions.IgnoreCase);

输入的参考标识中如果有正则中有特殊意义的字符,需要对其进行预处理,另外需要在程序中进行异常处理,这个自己处理下吧
如果源字符串中同时多处出现输入的参考标识,这里取第一个出现的参考标识所在的<table>

Match mm = Regex.Match(html, @"<table[^>]*>(((<table[^>]*>(?<o>)|</table>(?<-o>)|(?!</?table)[\s\S])*)(?(o)(?!)))\b" + "会员输赢资料" + @"\b(?:(?!<table[^>]*>)[\s\S])*?(((<table[^>]*>(?<o>)|</table>(?<-o>)|(?!</?table)[\s\S])*)(?(o)(?!)))</table>", RegexOptions.IgnoreCase);
            if (mm.Success)
            {
                //MessageBox.Show(mm.Value);

                //MatchCollection mdd = GetMidValue("<td", "</td>", mm.Value);
                //foreach (Match m in mdd)
                //{
                //    for (int i = 1; i < m.Groups.Count; i++)
                //    {                       
                //        restult += m.Groups[i].Value;//就是你要的结果
                //    }                    
                //}

                MatchCollection mc = Regex.Matches(mm.Value, @"<td[^>]*>\s*(?<content>[\s\S]*?)\s*</td>", RegexOptions.IgnoreCase);
                foreach(Match m in mc)
                {
                    for (int i = 1; i < m.Groups.Count; i++)
                    {
                        restult += m.Groups[i].Value + "\n";
                    }
                }
                MessageBox.Show(restult);
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值