我获取到某个网页的HTML代码,例如:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

            
    

<head>
    <title>
    ...(省略)
    <ul class="shop-list">
       <li>
         <h4>
            <a target="_blank" href="http://item.taobao.com/auction/item_detail-0db1-91ea75432fd891a8e003b4a984c92d44.htm">
<<中文版3ds Max 8家居效果图设计完全攻略>>随书光盘
              </a>
         </h4>
         <div class="item">
          <div class="pic">     <a title="<<中文版3ds Max 8家居效果图设计完全攻略>>随书光盘"  href="http://item.taobao.com/auction/item_detail-0db1-91ea75432fd891a8e003b4a984c92d44.htm" target="_blank">
               <img src="http://img03.taobaocdn.com/bao/uploaded/i3/20071205/911/T1z50aXmY0gky9Tz.7_065338.jpg_sum.jpg"/>
            </a>
          </div>
         </div>
       </li>
     </ul>
     ...(省略)请问如何我忽略前面不关心的数据,获取到
http://item.taobao.com/auction/item_detail-0db1-91ea75432fd891a8e003b4a984c92d44.htm
<<中文版3ds Max 8家居效果图设计完全攻略>>随书光盘
http://img03.taobaocdn.com/bao/uploaded/i3/20071205/911/T1z50aXmY0gky9Tz.7_065338.jpg_sum.jpg
这几个关键的数据,System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex()?.
谢谢.

解决方案 »

  1.   

    需求看起来不是很明确,根据什么来区分关心的和不关心的数据?根据楼主的例子可以写出以下正则
    MatchCollection mc = Regex.Matches(yourStr, @"<a\s+title=""(?<title>[^""]*)""\s+href=""(?<url>[^""]*)""[^>]*>\s*<img\s+src=""(?<src>[^""]*)""[^>]*>\s*</a>", RegexOptions.IgnoreCase);
    foreach (Match m in mc)
    {
        richTextBox2.Text += m.Groups["title"].Value + "\n";
        richTextBox2.Text += m.Groups["url"].Value + "\n";
        richTextBox2.Text += m.Groups["src"].Value + "\n";
    }但是因为楼主的需求不是很明确,所以以上代码可能仅适用于这个例子,需要楼主更清楚的说明一下需求如要提取的数据符合什么样的规律,哪一部分会变,哪一部分固定等等
      

  2.   

    呵呵,太感谢5楼的~~~
    可能我没有说明白,就是这个网页的前面部分我不关心,应该直接判断到<ul class="shop-list">
    ,这个地方,可能用字符串判断就可以,要么就是2楼的方法,用DOM 来做~~~
      

  3.   


    那到了<ul class="shop-list"> 之后呢,比如这之后的代码中有不需要的<a...>...</a>,如何区分如果能用DOM来处理,DOM会简单些,正则会灵活些
      

  4.   

    实际上,像你这种情况,使用正则表达式是很麻烦的,而且通用不好,容易出错,最近在做这个类似的,可以用xmldocument 类里的方法来解决,
    首先可以用一段正则表达式来获取<ul class="shop-list"></ul> ,然后,用Xpath来去值,代码如下:Regex reg=new Regex(@"<ul[^>]*?class=""shop-list""[^>]*>((?>(?<o><ul[^>]*>)|(?<-o></ul>)|(?:(?!</?ul)[\s\S]))*)(?(o)(?!))</ul>");
    Match m=reg.match(htmlsrc);
    string s="";
    if(m.success)
    s=m.group[0].value;
    XmlDocument xm = new XmlDocument();
    xm.LoadXml(s);
    //
    //后面可以用xmldocumen的一些方法来取值
    //
    XmlNodeList NodeList = xml.SelectNodes("ul/div");//这里XPath可以写上你的筛选条件,
    foreach(XmlNode xn in NodeList)
    {
    //要存入到数据库或者数字等
    }

      

  5.   

    恩,可能我没有说清楚,实际上我只关心整个HTML里面其中的一部分数据:<ul class="shop-list">
           <li>
             <h4>
                <a target="_blank" href="http://item.taobao.com/auction/item_detail-0db1-91ea75432fd891a8e003b4a984c92d44.htm">
                                        <<中文版3ds Max 8家居效果图设计完全攻略>>随书光盘
                  </a>
             </h4>
             <div class="item">
              <div class="pic">                                                                    <a title="<<中文版3ds Max 8家居效果图设计完全攻略>>随书光盘"  href="http://item.taobao.com/auction/item_detail-0db1-91ea75432fd891a8e003b4a984c92d44.htm" target="_blank">
                   <img src="http://img03.taobaocdn.com/bao/uploaded/i3/20071205/911/T1z50aXmY0gky9Tz.7_065338.jpg_sum.jpg"/>
                </a>
              </div>
             </div>
           </li>
         </ul>具体的数据就是刚才所说的数据,那么我处理的话,可能就是先判断到该数据的开始部分,然后判断什么地方结束,然后获取直接的数据部分,利用正则表达式来从该部分数据来获取自己想获取的数据~~~
    不知道这样效率怎么样,用DOM的话,每个都处理的话,大部分数据不关心,这样会不会影响效率?
      

  6.   

    恩,谢谢10楼热心回答,主要是数据是HTML数据,不是XML,HTML随意性比较大,所以.net里面没有像            WebResponse resp = myWebRequest.GetResponse();
                Stream stream = resp.GetResponseStream();
                XmlTextReader reader = new XmlTextReader(stream);
                reader.XmlResolver = null; // ignore the DTD
                reader.WhitespaceHandling = WhitespaceHandling.None;所以,处理这个问题,还是利用正则表达式来判断,这个我也是从网上找了很多资料获知的,呵呵~~~
      

  7.   

    具体问题具体分析,效率有开发效率和执行效率,要看处理对象的大小,复杂度等等,还要看知识的掌握程度对于我来说,这种问题我会毫不犹豫的选择正则,因为基本上不占用开发时间,呵呵Regex regUl = new Regex(@"<ul\s+class=""shop-list"">(?>(?:(?!</?ul\b).)*)</ul>", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled);
    Regex regCon = new Regex(@"<a\s+title=""(?<title>[^""]*)""\s+href=""(?<url>[^""]*)""[^>]*>\s*<img\s+src=""(?<src>[^""]*)""[^>]*>\s*</a>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
    Match mUl = regUl.Match(yourStr);
    if (mUl.Success)
    {
        Match mCon = regCon.Match(mUl.Value);
        if(mCon.Success)
        {
            richTextBox2.Text += mCon.Groups["title"].Value + "\n";
            richTextBox2.Text += mCon.Groups["url"].Value + "\n";
            richTextBox2.Text += mCon.Groups["src"].Value + "\n";
        }
    }正则并不代表低的执行效率,要看正则写出的正则和使用的方式