2014-12-30 53 views
1

我試圖在節點和webBrowser控件中使用phantomjs,cheerio在C#中獲取我的歌曲列表, 我可以成功獲取html,但沒有歌曲列表,不知道爲什麼我不能得到它...試圖讓網站上的歌曲列表不起作用

我可以做的唯一方法是通過開發工具複製HTML並通過Jquery進行分析。

這是我在winform代碼:

private void Form1_Load(object sender, EventArgs e) 
    { 
     webBrowser1.Navigate("http://grooveshark.com/#!/shinningstar1001/collection"); 
     webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted; 
    } 

    void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     File.WriteAllText("D://test.txt", webBrowser1.DocumentText); 
    } 

在Cheerio:

var cheerio = require('cheerio'); 
var request = require('request'); 

var url = 'http://grooveshark.com/#!/shinningstar1001/collection'; 

request({ 
    url: url, 
    headers: {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'} 
}, function (err, resp, body) { 
    $ = cheerio.load(body); 
    console.log(body);   
}) 

我想這是因爲我不能讓阿賈克斯負荷後的完整的文檔?

但爲什麼webBrowser控制不能工作呢?我可以看到完整的內容被加載到控件中。 任何建議將真正感激。

我已經試過@Murray Foxcroft解決方案仍然不能得到我想要的確切的html: enter image description here

其他問題

通過@Murray Foxcroft的解決方案,我可以得到8%列表內容,但爲什麼我無法獲得管道進入頁面的完整歌曲列表?例如,我可以得到列表中大約第40位的歌曲「Set me free」,但是歌曲列表中大約第70位的歌曲「This Love」無法播放。 (兩首歌肯定是在網站上)

 if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) 
      return; 
     if (richTextBox1.Text.Length > 0) return; 
     var songList = webBrowser1.Document.GetElementById("profile-grid"); 

     //try to get "This Love" that never step into the code: 
     if (songList != null && songList.InnerHtml.Contains("This Love")){...} 

     //"Set Me Free" is OK: 
     if (songList != null && songList.InnerHtml.Contains("Set Me Free")) 
     { 
      richTextBox1.Text = songList.OuterHtml;     
     }   

回答

1

對於WebBrowser示例,事件是否真的會觸發?

嘗試該事件的導航關聯之前:

即交換線以執行以下操作:

webBrowser1.DocumentCompleted + = webBrowser1_DocumentCompleted;

webBrowser1.Navigate(「http://grooveshark.com/#!/shinningstar1001/collection」);

此外,DocumentCompleted可能觸發每個子文檔(如CSS樣式表),因此請確保您正在捕獲您之後的URL的事件。

void BrowserDocumentCompleted(object sender, 
     WebBrowserDocumentCompletedEventArgs e) 
{ 
    if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath) 
    return; 

    //The page is finished loading 
} 

進一步的細節在這裏:Detect WebBrowser complete page loading

最終的解決方案 - 內容通過管道被輸送到從其他來源的主要頁面,以便尋找目標DIV大約是最好的解決辦法:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      // If the ReadyState is Complete then the page or an iFrame within have completed downloading. 
      if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) 
       return; 

      // Ensures only the first match of page-content is resturned to the RichTextBox. 
      // If this does not contain what you are looking for then you may need to find an 
      // additional way to refine for the content you are after. 
      if (richTextBox1.Text.Length > 0) return; 

      // Check to see if we have got the page-content div in our result source 
      // and set the richtextbox if we have it. 
      var songList = webBrowser1.Document.GetElementById("page-content"); 
      if (songList != null) 
      { 
       richTextBox1.Text = songList.OuterHtml; 
      } 
     } 
+0

我試過了,但它不起作用。 –

+0

仍然不能得到正確的內容參考圖片:( –

+0

但是,如果你使用chrome開發工具並瀏覽網站,你可以找到與Ctrl + F的ID和找到歌曲列表裏面,這就是我可以' –

相關問題