html标记如下:
...
<div id=div1>
 <div>
   <ol>
        <li class=g>
          <h3 class=r>
              <a href="...">文字</a>
          <div>其他内容</div>
        <li class=g>
          <h3 class=r>
              <a href="...">文字</a>
          <div>其他内容</div>
        <li class=g>
          <h3 class=r>
              <a href="...">文字</a>
          <div>其他内容</div>
   </ol>
 </div>
</div>
...
问题1. 要查找div1里的每个<li class=g>内容,保存在string[]中
问题2. 要查找div1里的每个<li class=g>里a标记href内容,如何操作
thanks

解决方案 »

  1.   

    本帖最后由 lxcnn 于 2010-04-28 13:00:05 编辑
      

  2.   

    抓的google的数据,确实没有</li>,参考了你的blog(http://blog.csdn.net/lxcnn/archive/2009/08/03/4402808.aspx)大致代码如下:
                string id = "res";
                string pattern = @"<([a-z]+)(?:(?!\bid\b)[^<>])*id=([""']?){0}\2[^>]*>(?><\1[^>]*>(?<o>)|</\1>(?<-o>)|(?:(?!</?\1).)*)*(?(o)(?!))</\1>";
                Match match = Regex.Match(source, string.Format(pattern, Regex.Escape(id)), RegexOptions.Singleline | RegexOptions.IgnoreCase);
                Console.WriteLine("--------begin {0}--------", id);
                if (match.Success)
                {
                    string test = match.Value;                string[] results = test.Split(new string[]{"<li class=g>"}, StringSplitOptions.None);
                    foreach (string result in results)
                    {
                        Console.WriteLine("-------------------", id);
                        Console.WriteLine(result);
                        //下面再做判断
                    }
                }
                Console.WriteLine("--------end {0}--------", id);但感觉没有您写的优雅
      

  3.   

    <li class=g>其实就是搜索出来的列表,我要针对每个<li class=g>里的内容进行分析
      

  4.   

    这个问题,如果我理解不错的话,似乎不简单。
    你先获取div1的内容。
    string str=div1Content;
    然后用正则获取li class=g的内容
    Regex reg=new Regex("<li class=g>(.+?)</li>");
    for(int i=0;i<reg.Matchs(div1Content).Count;i++)
    {
       string temValue=reg.Matchs(div1Content)[i].Group[1].value;//获取li class=g的内容
       //至于保存于string[]中,我想楼主应该有方法。这里不写了。
       //获取内容后,再获取a标签
      String MyHrefPattern = @"<a[^>]+href=\s*(?:'(?<href>[^']+)'|""(?<href>[^""]+)""|(?<href>[^>\s]+))\s*[^>]*>(?<text>.*?)</a>"; //提取超链接的正则表达式
                Regex MyHrefRegex = new Regex(MyHrefPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
    }
    以上代码是手打,如果有误,楼主自己在VS里调试。。
    具体思路是这样的,楼主研究一下吧。
      

  5.   

    还有li标记里的href指的是取链接,还是文字,还是全部都要,一个li标记里是只有一个a标签,还是可能有多个
    -------------------
    取<li class=g>里的<h3 class=r>中的a标记的href(首先要保证链接,其次考虑文字),每个<h3 class=r>中应该只有一个a标记,如果有多个,取第一个
      

  6.   

    简单的写了下,可能根据你的实际情况还要做些改动            string id = Regex.Escape(textBox1.Text);
                List<string> listLi = new List<string>();
                List<string> listA = new List<string>();
                Regex regDiv = new Regex(@"(?is)<div[^>]*?id=(['""]?)" + id + @"\1[^>]*>(?><div[^>]*>(?<o>)|</div>(?<-o>)|(?:(?!</?div\b).)*)*(?(o)(?!))</div>");
                Regex regLi = new Regex(@"(?is)<li\s+class=g>\s*(.*?)\s*(?=</?(li|ol)\b)");
                Regex regA = new Regex(@"(?is)<a\b[^>]*?href=(['""])(?<link>[^'""\s>]+)\1[^>]*>(?<text>.*?)</a>");
                Match mDiv = regDiv.Match(yourStr);
                if(mDiv.Success)
                {
                    MatchCollection mcLi = regLi.Matches(mDiv.Value);
                    foreach (Match mLi in mcLi)
                    {
                        listLi.Add(mLi.Groups[1].Value);
                        Match mA = regA.Match(mLi.Groups[1].Value);
                        if (mA.Success)
                        {
                            listA.Add(mA.Value);
                        }
                    }                
                }
      

  7.   

    看了一下,结果已经差不多了,在listA中得到的是这样的记录
    <a href="http://stock.sohu.com/gzqh/" target=_blank class=l><em>股指期货</em>-搜狐证券</a>
    能方便的得到 http://stock.sohu.com/gzqh/ 和 <em>股指期货</em>-搜狐证券 吗?万分感谢!
      

  8.   

    实际上已经这样写正则了,只是不太清楚楼主要的结果,看下这样是否满足            string id = Regex.Escape(textBox1.Text);
                List<string> listLi = new List<string>();
                List<string> listLink = new List<string>();
                List<string> listText = new List<string>();
                Regex regDiv = new Regex(@"(?is)<div[^>]*?id=(['""]?)" + id + @"\1[^>]*>(?><div[^>]*>(?<o>)|</div>(?<-o>)|(?:(?!</?div\b).)*)*(?(o)(?!))</div>");
                Regex regLi = new Regex(@"(?is)<li\s+class=g>\s*(.*?)\s*(?=</?(li|ol)\b)");
                Regex regA = new Regex(@"(?is)<a\b[^>]*?href=(['""])(?<link>[^'""\s>]+)\1[^>]*>(?<text>.*?)</a>");
                Match mDiv = regDiv.Match(yourStr);
                if(mDiv.Success)
                {
                    MatchCollection mcLi = regLi.Matches(mDiv.Value);
                    foreach (Match mLi in mcLi)
                    {
                        listLi.Add(mLi.Groups[1].Value);
                        Match mA = regA.Match(mLi.Groups[1].Value);
                        if (mA.Success)
                        {
                            listA.Add(mA.Groups["link"].Value);
                            listA.Add(mA.Groups["text"].Value);
                        }
                    }                
                }