小弟初学C#,最近要做一个关于web信息提取的程序,网上具体的程序也有,不过我想问一下,是不是不同的HTML文件就要用不同的算法来实现,比如说
                //取出和数据有关的那段源码
               int iBodyStart = strWebContent.IndexOf("<body", 0);
             int iStart = strWebContent.IndexOf("歌曲TOP500", iBodyStart);
             int iTableStart = strWebContent.IndexOf("<table", iStart);
             int iTableEnd = strWebContent.IndexOf("</table>", iTableStart);
             string strWeb = strWebContent.Substring(iTableStart, iTableEnd - iTableStart + 8);
       具体的算法要怎么改?? 谢谢

解决方案 »

  1.   

    有没有高手,谁能帮我解释下这段程序:
     private void button1_Click(object sender, EventArgs e)
            {
                //要抓取的URL地址
                string Url = "http://list.mp3.baidu.com/topso/mp3topsong.html?id=1#top2";            //得到指定Url的源码
       string strWebContent = GetWebContent(Url);            richTextBox1.Text = strWebContent;
       //取出和数据有关的那段源码
                int iBodyStart = strWebContent.IndexOf("<body", 0);
                int iStart = strWebContent.IndexOf("歌曲TOP500", iBodyStart);
                int iTableStart = strWebContent.IndexOf("<table", iStart);
                int iTableEnd = strWebContent.IndexOf("</table>", iTableStart);
                string strWeb = strWebContent.Substring(iTableStart, iTableEnd - iTableStart + 8);            //生成HtmlDocument
       WebBrowser webb = new WebBrowser();
                webb.Navigate("about:blank");
                HtmlDocument htmldoc = webb.Document.OpenNew(true);
                htmldoc.Write(strWeb);
                HtmlElementCollection htmlTR = htmldoc.GetElementsByTagName("TR");
                foreach (HtmlElement tr in htmlTR)
                {
                    string strID = tr.GetElementsByTagName("TD")[0].InnerText;
                    string strName = SplitName(tr.GetElementsByTagName("TD")[1].InnerText, "MusicName");
                    string strSinger = SplitName(tr.GetElementsByTagName("TD")[1].InnerText, "Singer");
                    strID = strID.Replace(".", "");
                    //插入DataTable
                    AddLine(strID, strName, strSinger,"0");                string strID1 = tr.GetElementsByTagName("TD")[2].InnerText;
                    string strName1 = SplitName(tr.GetElementsByTagName("TD")[3].InnerText, "MusicName");
                    string strSinger1 = SplitName(tr.GetElementsByTagName("TD")[3].InnerText, "Singer");
                    //插入DataTable
                    strID1 = strID1.Replace(".", "");
                    AddLine(strID1, strName1, strSinger1,"0");                string strID2 = tr.GetElementsByTagName("TD")[4].InnerText;
                    string strName2 = SplitName(tr.GetElementsByTagName("TD")[5].InnerText, "MusicName");
                    string strSinger2 = SplitName(tr.GetElementsByTagName("TD")[5].InnerText, "Singer");
                    //插入DataTable
                    strID2 = strID2.Replace(".", "");
                    AddLine(strID2, strName2, strSinger2,"0");            }
                //插入数据库
                InsertData(dt);
       
                dataGridView1.DataSource = dt.DefaultView;
    }
      

  2.   

    这段程序就是获取h指定url地址的内容,然后根据该内容生产一个HtmlDocument对象,接着通过IHtml接口访问该对象的一些元素。
    不过个人觉得webbrowser太耗资源了。要实现网页内容截取我觉得还是用HttpWebRequest类。
      

  3.   

    谢谢,有没有大侠帮忙具体的说一下,比如我要提取其他网页的信息,要改哪些地方??还有string   strName1   =   SplitName(tr.GetElementsByTagName("TD")[3].InnerText,   "MusicName"); 
        这句话是什么意思..
      

  4.   

    不同的网页要进行不同的配置,因为不同的网页内容可能放在不同的标签中,有的放在table里,有的放在div里,因此要给不同的网站建立模板,把模板存在配置文件里
      

  5.   

    我想获取http://s1.pet.mop.com/mopet.html 在登录以后这个页面的源码但,问题来了...在这个打开的网页不同的地方点右键查看源码,居然不一样?是框架,还是???求助,如何才能获得这个网页的完全的源码(HTML)??
      

  6.   

    这几个月都在做点击数和回复数挖掘,主要是分析健康指数和关注指数,只是对C#不熟悉,我是使用Mozilla开源程序,看了楼上的样例代码,似乎都是类似的,就如2楼所说,用webbrowser会很耗资源,当前,我也用一个同等的类,它要加载相关资源,例如,图片,解析Javascript,所以,很耗资源,不过很容易解决AJAX抓取问题。如4楼所说,要对付各种网页结构,那么将DOM解析过程编码到程序中不太合适,得放在配置文件中,到时候改配置文件就行了。
      

  7.   


    Mozilla开源程序 是什么?哪里能下载啊