2017-07-04 86 views
1

這裏新增了C#並運行異步任務。使用C從網頁中刮取JSON#

我試圖從網站上刮一些音樂專輯信息。網頁的搜索以明文生成JSON對象,但我似乎無法訪問任何DOM信息。以下是我嘗試過的(使用HtmlAgilityPack):

using HtmlAgilityPack; 
using System; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace WindowsFormsApp1 { 
public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 

    public async Task<String> AlbumScraper(string albumname) { 

     HtmlWeb web = new HtmlWeb(); 

     string albumurl = Uri.EscapeUriString("https://www.metal-archives.com/search/ajax-album-search/?field=title&query=" + albumname); 
     Console.Write(albumurl); 
     var albumdoc = await Task.Factory.StartNew(() => web.Load(albumurl)); 
     string albumjson = ""; 

     if (albumdoc.DocumentNode != null) { 
      albumjson = albumdoc.DocumentNode.InnerText; 
     } 

     return albumjson; 
    } 

    private async void Form1_Load(object sender, EventArgs e) { 
     string rawtext = await AlbumScraper("rust+in+peace"); 
     Console.Write(rawtext); 
    } 
} 
} 

如何獲取生成的JSON文本?我可以清楚地看到它時,我加載「albumurl」網址...

+0

爲什麼不能用一個簡單的HTTP GET請求獲取JSON數據然後將其解析爲一個對象? –

+0

爲什麼你想要加載爲HTML/XML?它返回JSON而不是網頁,因此沒有DOM信息。只需使用JSON.NET解析器來解析響應,如JSON.NET –

回答

1

首先你不需要HtmlAgility包。

其次,嘗試:

using Newtonsoft.Json.Linq; 

string albumurl = Uri.EscapeUriString("https://www.metal-archives.com/search/ajax-album-search/?field=title&query=rust+in+peace"); 
string doc = ""; 
using (System.Net.WebClient client = new System.Net.WebClient()) // WebClient class inherits IDisposable 
{ 
    doc = client.DownloadString(albumurl); 
} 

,那麼你可以反序列化(@itikhomi)

AlbumSearchResponse data = JsonConvert.DeserializeObject<AlbumSearchResponse>(doc); 

你也可以分析它手動

JObject json = JObject.Parse(doc); 
string error= Convert.ToString(json["error"]); 
. . . 
string aaData= Convert.ToString(json["aaData"]); 
JArray arr = JArray.Parse(aaData); 
foreach(JToken token in arr) 
{ 
    string[] strarr = token.ToObject<string[]>(); 
} 
+0

取得了訣竅。我沒有意識到HtmlAgilityPack沒有加載動態內容。謝謝! – LexxTal

3

您可以通過在線工具生成它http://json2csharp.com/ 然後生成的類添加到您的代碼

public class AlbumSearchResponse 
    { 
     public string error { get; set; } 
     public int iTotalRecords { get; set; } 
     public int iTotalDisplayRecords { get; set; } 
     public int sEcho { get; set; } 
     public List<List<string>> aaData { get; set; } 
    } 

您迴應文本轉換爲

var data = JsonConvert.DeserializeObject<AlbumSearchResponse>(response); 
     foreach (var item in data.aaData) 
     { 
      //do whatever your want with data 
     } 

還您需要的NuGet添加newtonsoft JSON包得到JsonConvert工作

+0

整潔的工具,謝謝。使用'System.Net.WebClient'的 – LexxTal