網頁提取資料常用正則

風靈使發表於2018-09-05

匹配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);
            }

相關文章