2017-01-05 102 views
1

我想獲得存儲在跨度的HTML源代碼標籤不同的電影IMDB評分。爲此,我嘗試使用Html解析從HTML span標籤收集數據。一切正常,直到調用DocumentNode的SelectNodes()方法返回null爲止。DocumentNode.SelectNodes返回null - HtmlAgilityPack

我知道這個問題已經被問了無數次,但儘管做了很多的研究和嘗試不同的解決方案,我似乎無法弄清楚什麼是錯我的代碼。爲了完成我的學期項目,解決這個問題對我來說真的很重要,所以任何形式的幫助都是值得讚賞的。 謝謝。

string url = "https://www.google.com/search?client=opera&q=into+the+wild&sourceid=opera&ie=UTF-8&oe=UTF-8"; 

     StreamReader sourceCode = makeHttpRequest(url); 
     //makeRequest() returns the html source code of the url 
     String sourceCodeString = sourceCode.ReadToEnd(); 

     HtmlDocument doc = new HtmlDocument(); 
     doc.LoadHtml(sourceCodeString); 
     var itemList = doc.DocumentNode.SelectNodes("//span[@class='_tvg']") 
       .Select(p => p.InnerText) 
       .ToList(); 

回答

1

這裏的關鍵是設置一個用戶代理。

下面的代碼返回3個結果,如果刪除User-Agent你會得到一個空值...

using (var client = new HttpClient()) 
{ 
    client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"); 
    var html = await client.GetStringAsync("https://www.google.com/search?client=opera&q=into+the+wild&sourceid=opera&ie=UTF-8&oe=UTF-8"); 
    var doc = new HtmlAgilityPack.HtmlDocument(); 
    doc.LoadHtml(html); 
    var result = doc.DocumentNode 
        .SelectNodes("//span[@class='_tvg']") 
        .Select(p => p.InnerText) 
        .ToList(); 


} 
+0

我用上面的代碼,但聲明 VAR HTML =後等待client.GetStringAsync(」 「); 程序終止(不會引發任何異常),其餘語句不會執行。你能解釋一下這個原因嗎? –

+0

@KhursandShakeel只需創建一個空的WinForms項目粘貼此代碼爲*的Form_Load *,然後再試一次(不要忘記標記方法異步)BTW:您可能需要使用try/catch塊... –

+0

我標誌着方法與異步,並把一個try/catch塊,但仍然沒有成功。 BTW我工作的控制檯應用程序而不是Windows窗體應用程序,因爲我從來沒有在WinForms應用程序的工作。不能在控制檯應用程序上完成嗎? –