比如有一段HTML的字符串, 
  string html=   "<body>...............</body>";  string get= betw(html,"<body>","</body>");
  我想取从<body>到</body>之间的HTML代码应该怎么取呀?betw(html,"<body>","</body>"); 这句写错了,正确应该是如何写呢?特此请教CSDN的高人!在线等待,5点半前结帖!

解决方案 »

  1.   

    如果<body>前和</body>后没有其它代码:
    1.  string get = html.SubString("<body>".Length,html.Length-"<body></body>".Length);
    2. string get = html.Replace("<body>","").Replace("</body>"),"");如果<body>前或者</body>后还有其它代码:
    1. int pos1 = html.IndexOf("<body>");
       int pos2 = html.IndexOf("</body>");
    string get = html.SubString(pos1+"<body>".Length, pos2);
      

  2.   

    字串不会,HTML页在上是用document.all("body").innerHtml得到.
      

  3.   

    private string betw(string HTMLContent,string startStr,string endStr)
    {
    string ret="";
    int startTablePos=HTMLContent.LastIndexOf(startStr);
    int endTablePos=HTMLContent.IndexOf(endStr);
    ret=HTMLContent.Substring(startTablePos,endTablePos-startTablePos+endStr.Length);
    ret=ret.Substring(startStr.Length,ret.Length-(startStr.Length +endStr.Length));
    return ret;
    }
      

  4.   

    回复人: forestyang 你的方法不行啊,兄弟 "<body>".Length  不支持呀,请教正确语法应如何写?
      

  5.   

    private string betw(string HTMLContent,string startStr,string endStr)
    {
    string ret="";
    int startTablePos=HTMLContent.LastIndexOf(startStr);
    int endTablePos=HTMLContent.IndexOf(endStr);
    ret=HTMLContent.Substring(startTablePos,endTablePos-startTablePos+endStr.Length);
    ret=ret.Substring(startStr.Length,ret.Length-(startStr.Length +endStr.Length));
    return ret;
    }
    或者你去搜索一下吧!
      

  6.   

    html可以用innetHTML
    正则可以如此\<body\>([.\n]*?\)<\/body\>
      

  7.   

    回:zipo 最后一句有错呀,ret=ret.Substring(startStr.Length,ret.Length-(startStr.Length +endStr.Length));G:\test\templet.aspx.cs(90): 运算符“-”无法应用于“int”和“string”类型的操作数
      

  8.   

    正则:
    引入命名空间:
    using System.Text.RegularExpressions;string s=Regex.Replace(html,@".*<body>|<\/body>.*","");
      

  9.   

    回: wj2929
      这段是过滤的, 与我的情况刚好相反,请教一下怎么取<body>与</body>之间的数据,而不是REPLACE,谢谢!
      

  10.   

    怎么会相反呢 上面的正则表达式是把<body>...</body>之外的数据替换为空了包括<body>和</body>
    得到的就是两标签之间的数据阿
    写成你要的函数如下:
    private string betw(string HTMLContent,string startStr,string endStr)
    {
    string pattern=".*"+startStr+"|"+endStr+".*";
    string ret=Regex.Replace(HTMLContent,pattern,"");
    return ret;
    }另外 你说上面我提供的
    private string betw(string HTMLContent,string startStr,string endStr)
    {
    string ret="";
    int startTablePos=HTMLContent.LastIndexOf(startStr);
    int endTablePos=HTMLContent.IndexOf(endStr);
    ret=HTMLContent.Substring(startTablePos,endTablePos-startTablePos+endStr.Length);
    ret=ret.Substring(startStr.Length,ret.Length-(startStr.Length +endStr.Length));
    return ret;
    }
    说 运算符“-”无法应用于“int”和“string”类型的操作数
    但我这里没有错误啊 能正常的运行
      

  11.   

    我以前写的一个抓取类
    using System;
    using System.Text;
    using System.Net;
    using System.Text.RegularExpressions;namespace Efun.Common
    {
    /// <summary>
    /// CatchWebContent 的摘要说明。
    /// </summary>
    public class CatchWebContent
    {
    public CatchWebContent()
    {
    /// <summary>
    /// CatchWebContent获取指定URL地址的页面内容的HTML代码。
    /// </summary>
    }
    public string ByteGetContent(string strUrl)
    {
    ///<summary>
    ///字节方式方式读取网页内容,返回网页内容的全部字符,传入要抓取的网页地址
    ///</summary>

    strUrl =  FormatString(strUrl); string strContent; if (CheckURL(strUrl))
    {
    try
    {
    WebClient myclien = new WebClient();
    byte[] myData; myData = myclien.DownloadData(strUrl);
    strContent = System.Text.Encoding.Default.GetString(myData).ToString().Trim(); return strContent;
    }
    catch(System.Exception Ex)
    {
    return Ex.Message.ToString();
    }
    }
    else
    {
    return "您输入的地址不正确";
    }

    }
    public string ByteGetContentClean(string strUrl)
    {
    ///<summary>
    ///字节方式读取网页内容,返回网页过滤掉HTML标签后内容的字符(保留<br>标记),传入要抓取的网页地址
    ///</summary>

    string strContent;
    strContent = ByteGetContent(strUrl);
    // strContent = Regex.Replace(strContent.ToLower(),@"[^(<body>(.|\n)*<\/body>)]","");
    strContent = Regex.Replace(strContent.ToLower(),@"(?!<br>|<br\/>)<.*?>","");
    return strContent;
    }

    public string StreamGetContent(string strUrl)
    {
    ///<summary>
    ///流方式读取网页内容,返回网页内容的全部字符,传入要抓取的网页地址
    ///</summary>

    strUrl =  FormatString(strUrl); if (CheckURL(strUrl))
    {
    try
    {
    string strContent;
    WebClient myclien = new WebClient(); System.IO.StreamReader mystream = new System.IO.StreamReader(myclien.OpenRead(strUrl),System.Text.Encoding.GetEncoding("gb2312"));
    strContent = mystream.ReadToEnd().ToString().Trim(); return strContent;
    }
    catch(System.Exception Ex)
    {
    return Ex.Message.ToString();
    }
    }
    else
    {
    return "您输入的地址不正确";
    }
    }
    public string StreamGetContentClean(string strUrl)
    {
    ///<summary>
    ///流方式读取网页内容,返回网页过滤掉HTML标签后内容的字符(保留<br>标记),传入要抓取的网页地址
    ///</summary>

    string strContent;
    strContent = StreamGetContent(strUrl);
    // strContent = Regex.Replace(strContent.ToLower(),@"[^(<body>(.|\n)*<\/body>)]","");
    strContent = Regex.Replace(strContent.ToLower(),@"(?!<br>|<br\/>)<.*?>","");
    return strContent;
    } private bool CheckURL(string strUrl)
    {
    ///<summary>
    ///检测输入的地址格式
    ///</summary>

    if (Regex.IsMatch(strUrl,@"(\s|\n|^)(\w+://[^\s\n]+)"))
    {
    return true;
    }
    else
    {
    return false;
    }
    }
    private string FormatString(string strUrl)
    {
    ///<summary>
    ///检测输入的地址格式有没有包含URL前缀
    ///</summary>

    if (strUrl.ToLower().Substring(0,7) != "http://")
    {
    strUrl = "http://" + strUrl;
    }
    return strUrl;
    }
    }
    }