2017-07-04 1 views
1

Nouveau sur C# ici et pour exécuter des tâches asynchrones. J'essaye de gratter quelques informations d'album de musique d'un site Web. La recherche de la page Web produit un objet JSON en texte brut, mais je n'arrive pas à accéder aux informations du DOM. Voici ce que j'ai essayé (en utilisant HtmlAgilityPack):Scrape JSON à partir de la page Web avec C#

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); 
    } 
} 
} 

Comment puis-je saisir le texte JSON généré? Je peux le voir clairement quand je charge le « albumurl » URL ...

+0

Pourquoi ne pas utiliser un simple http get demande d'obtenir les données JSON puis l'analyser dans un objet? –

+0

Pourquoi essayez-vous de charger en HTML/XML? Il retourne JSON pas une page web, donc il n'y a pas d'infos DOM. Juste analyser la réponse en utilisant un désérialiseur JSON comme JSON.NET –

Répondre

1

Tout d'abord, vous n'avez pas besoin HtmlAgility Pack.

Deuxièmement, essayez:

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); 
} 

alors vous pouvez désérialiser (@itikhomi)

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

Vous pouvez également analyser manuellement

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

en utilisant 'System.Net.WebClient' a fait l'affaire. Je n'ai pas réalisé que HtmlAgilityPack n'a pas chargé le contenu dynamique. Je vous remercie! – LexxTal

3

Vous pouvez générer par l'outil en ligne http://json2csharp.com/ Puis ajouter classe générée à votre code

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; } 
    } 

convertir votre texte de réponse à la classe

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

aussi vous avez besoin d'ajouter package newtonsoft JSON de NuGet pour obtenir JsonConvert travailler

+0

Outil soigné, merci. – LexxTal