定義一首歌曲的結構 [csharp] public class sMp3 { public sMp3() { } public string strSid;//sid public string strDownPage;//下載頁面 public string strEdition;//專輯名稱 public string strSinger;//歌手名稱 public string strUrl;//下載地址 } 在一個列表中存放所有需要解析的歌曲地址 List<sMp3> listSongs = new List<sMp3>(); [csharp] 新建一個HtmlAgilityPack.HtmlDocument對象 用來獲取和解析HTML頁面 HtmlAgilityPack.HtmlDocument hdoc_Main = new HtmlAgilityPack.HtmlDocument(); 定義需要操作的XPath路徑 [csharp] //主頁 string Baidu_Music_MainPage_strUrl = "http://music.baidu.com/"; string Baidu_Music_MainPage_Label = "a"; string Baidu_Music_MainPage_Value = "sid"; string Baidu_Music_MainPage_strXpath = "./html[1]/body[1]/div[4]/div[1]/div[1]/div[2]/div[3]/div[1]/div[1]"; //下載的頁面 如 http://music.baidu.com/song/31496563/download string Baidu_Music_DownMusic_strXpath="./html[1]/body[1]/div[1]/div[4]"; string Baidu_Music_DownMusic_Label = "a"; string Baidu_Music_DownMusic_Value = "href"; string Baidu_Music_DownMusic_strXpath_Title = "./html[1]/body[1]/div[1]/div[2]"; string Baidu_Music_DownMusic_Title = "title"; 至於這些Xpath路徑是怎麼來的..可以通過查看源代碼的方式,.也可以通過我之前發布的XPath工具(XPathTool)來查看得到。 XpathTool介紹地址 http://blog.csdn.net/witch_soya/article/details/8486893 XPathTool下載地址 http://download.csdn.net/detail/witch_soya/4978587 核心函數之一 :getLabelVal 這個函數接受一個 HtmlAgilityPack.HtmlDocument,實際上就是指定了要解析的HTML文件,strXpath是指定的Xpath語句,這樣就能通過Xpath截取HTML中一部分內容了。然後通過 strLabel和strValue 兩個參數在截取出來的內容中提取需要的指定標簽的指定屬性值。比如 HtmlAgilityPack.HtmlDocument 加載了一個html文檔,通過strXpath就獲取了該HTML文檔中的一個區域 如果指定strLabel為 “a”strValue為”href”那麼,返回的Arraylist就是該區域中a標簽的所有超鏈接地址 [csharp] private ArrayList getLabelVal(HtmlAgilityPack.HtmlDocument dc, string strXpath, string strLabel, string strValue) { ArrayList Arr_Label_Val = new ArrayList(); //獲取指定的節點 HtmlNode node = dc.DocumentNode.SelectSingleNode(strXpath); if (node == null) { return null; } string strXPathLabel_Val = "descendant::" + strLabel; #region try { //HtmlNodeCollection atts = node.SelectNodes("//*[@background or @lowsrc or @src or @href]"); //這樣得到的是基於全文的 //HtmlNodeCollection hrefs = node.SelectNodes("//a[@href]"); //這樣得到的是基於本節點的 HtmlNodeCollection hrefs = node.SelectNodes(strXPathLabel_Val); if (hrefs == null) { return null; } foreach (HtmlNode href in hrefs) { if (href.Attributes[strValue] == null) { continue; } //這裡得到了歌曲的sid String strSid = href.Attributes[strValue].Value; Arr_Label_Val.Add(strSid); } } catch (System.Exception ex) { MessageBox.Show(ex.ToString()); } finally { // f2.Show(); } #endregion return Arr_Label_Val; } [csharp] //獲取百度音樂地址 private void button1_Click(object sender, EventArgs e) { HtmlWeb hw = new HtmlWeb(); string url = Baidu_Music_MainPage_strUrl; try { hdoc_Main = hw.Load(url); } catch (System.Exception ex) { MessageBox.Show(ex.ToString()); return; } //解析百度音樂主頁面 取得a標簽的sid Arr_sid = getLabelVal(hdoc_Main,Baidu_Music_MainPage_strXpath, Baidu_Music_MainPage_Label, Baidu_Music_MainPage_Value); if (Arr_sid == null) { MessageBox.Show("解析主頁面標簽錯誤"); return; } for (int i = 0; i < Arr_sid.Count; i++) { sMp3 sMp3Song = new sMp3(); sMp3Song.strSid = Arr_sid[i].ToString(); //組裝地址 string strDownLoadPage = "http://music.baidu.com/song/" + Arr_sid[i] + "/download"; sMp3Song.strDownPage = strDownLoadPage; listSongs.Add(sMp3Song); } //解析 下載音樂 網頁 Thread th = new Thread(DownLoadArrPage); th.Start(); } [csharp] //解析網頁 public delegate void MyInvoke(string str1, string str2,string str3); private void DownLoadArrPage() { MyInvoke mi = new MyInvoke(UpdateForm); HtmlWeb hw = new HtmlWeb(); for (int i = 0; i < listSongs.Count(); i++) { string strUrl =(listSongs[i].strDownPage).ToString(); HtmlAgilityPack.HtmlDocument hdoc_DownPage = hw.Load(strUrl); ArrayList Arr_DownLoadUrl = getLabelVal(hdoc_DownPage,Baidu_Music_DownMusic_strXpath, Baidu_Music_DownMusic_Label, Baidu_Music_DownMusic_Value); //實際上這個Arry_DownLoadUrl返回的只有一條超鏈接數據 不用遍歷了。 listSongs[i].strUrl = Arr_DownLoadUrl[0].ToString(); ArrayList Arr_Title = getLabelVal(hdoc_DownPage, Baidu_Music_DownMusic_strXpath_Title, Baidu_Music_DownMusic_Label, Baidu_Music_DownMusic_Title); listSongs[i].strEdition = Arr_Title[0].ToString(); listSongs[i].strSinger = Arr_Title[1].ToString(); } //Arry_Downloadurl存放的是 /data/music/file?link=http://zhangmenshiting.baidu.com/data2/music/31626527/3149656368400128.mp3?xcode=4b1b6b4117b45f71b5949db22586f5d7 這種內容 for (int i = 0; i < listSongs.Count(); i++) { string strUrl = (listSongs[i].strUrl).ToString(); //正則表達式 //@"demo_class.asp\?sort=([^x00-xff]{4})&id\=([a-z0-9]+)"; Regex reg = new Regex(@"http://(.*[a-zA-Z0-9_])"); var result = reg.Match(strUrl).Groups; foreach (var item in result) { // listSongs[i].strUrl = item; if (item.ToString().Contains("http://") == false) { continue; } //將內容添加到列表框 第一個列表框 this.BeginInvoke(mi, new Object[] { listSongs[i].strEdition,listSongs[i].strSinger, item.ToString() }); listSongs[i].strUrl = item.ToString(); } } }