2016-02-29 1 views
1

J'ai téléchargé un code source html et j'essaie d'en extraire des données pour le sérialiser en un fichier "json".Utiliser HtmlAgilityPack pour obtenir des données spécifiques en C# et le sérialiser en json

C'est le fichier source html: https://drive.google.com/file/d/0BzweTZsfeoxMTWk2LVdnYTJMRUE/view?usp=sharing

Dans le code html il y a des groupes « 2 » que je souhaite recueillir des données. À l'heure actuelle, j'ai réussi à obtenir le code à l'intérieur de ces groupes «2» et à l'afficher dans deux panneaux en utilisant des étiquettes. Mon code est placé comme suit:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using HtmlAgilityPack; 

namespace Parser_Test_1._0 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
      doc.Load(@"C:...\bin\Debug\xbFrSourceCode.txt"); 

      string datacollected1 = doc.DocumentNode.SelectNodes("//*[@id=\"favoritesContent\"]/div[2]/div[2]/ul")[0].InnerHtml; 
      string datacollected2 = doc.DocumentNode.SelectNodes("//*[@id=\"friendsContent\"]/div[2]/div[2]")[0].InnerHtml; 
      label1.Text = datacollected1; 
      label2.Text = datacollected2; 
     }  

    } 
} 

A partir de ces deux groupes que je souhaite recueillir les utilisateurs en eux et pour chaque utilisateur, leurs données respectives à ce sérialiser vers un fichier JSON.

Chaque utilisateur est séparé avec <li ...></li>

Pour chaque utilisateur que je souhaite obtenir:

  • Gamertag: data-gamertag="this is the gamertag"
  • image de joueur: il est en class="gamerpicWrapper" le src="this is the gamerpic"
  • Realname: <div class="realName">this is the realname</div>
  • PrimaryInfo: <div class="primaryInfo">this is the primaryinfo</div>
  • isOnline: <div class="statusIcon"> s'il y a le code ici, puis dans le fichier JSON cette valeur sera vrai </div>

Ceci est un exemple du format souhaité fichier « JSON » (Notez que le code de mise en jachère est probablement mal écrit .):

{ 
    "favorites" : 
    [ 
     { 
      "gamertag" : "Gamertag1", 
      "gamerpic" : "gamerpicURL", 
      "realname" : "", 
      "primaryInfo" : "", 
      "isOnline" : false, 
     }, 
     { 
      "gamertag" : "Gamertag2", 
      "gamerpic" : "gamerpicURL", 
      "realname" : "realname2", 
      "primaryInfo" : "primaryinfo2", 
      "isOnline" : true, 
     }, 
     { 
      "gamertag" : "Gamertag3", 
      "gamerpic" : "gamerpicURL", 
      "realname" : "", 
      "primaryInfo" : "", 
      "isOnline" : false, 
     }, 
     { 
      "gamertag" : "Gamertag4", 
      "gamerpic" : "gamerpicURL", 
      "realname" : "realname4", 
      "primaryInfo" : "", 
      "isOnline" : true, 
     } 

    ] 
    "friends" : 
    [ 
     { 
      "gamertag" : "Gamertag1", 
      "gamerpic" : "gamerpicURL", 
      "realname" : "", 
      "primaryInfo" : "", 
      "isOnline" : true, 
     }, 
     { 
      "gamertag" : "Gamertag2", 
      "gamerpic" : "gamerpicURL", 
      "realname" : "realname2", 
      "primaryInfo" : "primaryinfo2", 
      "isOnline" : false, 
     }, 
     { 
      "gamertag" : "Gamertag3", 
      "gamerpic" : "gamerpicURL", 
      "realname" : "realname3", 
      "primaryInfo" : "", 
      "isOnline" : true, 
     }, 
     { 
      "gamertag" : "Gamertag4", 
      "gamerpic" : "gamerpicURL", 
      "realname" : "", 
      "primaryInfo" : "", 
      "isOnline" : false, 
     } 

    ] 
} 

J'apprécierais grandement que quelqu'un puisse me montrer comment faire.

+0

Merci pour votre critique constructive. J'ai été attiré par le codage la plus grande partie de ma vie, mais récemment j'ai décidé de l'expérimenter en profondeur. J'ai décidé de commencer par apprendre C#. Pour apprendre cette langue, j'ai décidé de travailler sur un projet et d'apprendre la langue en essayant de créer et de terminer ce projet. Au moment où j'ai posté cette question, je commençais ce projet. J'ai déjà compris comment faire ce que je demande dans cette question. Et pour répondre à votre question, oui. A l'origine j'ai eu les xpaths du chrome. Bien que je ne savais pas comment exprimer et écrire les xpaths manuellement, je le sais maintenant. –

+0

Eh bien. Vous devez connaître xpath pour continuer. Je vais vous aider cette fois. Jetez un coup d'oeil à [ce] (https://msdn.microsoft.com/en-us/library/ms256086%28v=vs.110%29.aspx) pendant que je produis du code pour vous. –

+0

N'oubliez pas de marquer la bonne réponse ou au moins de commenter si cela vous a aidé. –

Répondre

1

Le code suivant montre une utilisation appropriée de xpath et HAP. L'utilisation de xpath peut être simplifiée, mais vous m'avez donné un fichier html de 4 Ko et je n'ai pas envie d'apprendre la structure de tout ça. Cependant, le code obtient tout ce que vous voulez en tant que variables. Maintenant, il est de votre devoir de mettre dans une structure JSON - mais si vous n'avez aucune connaissance de JSON alors envisager d'utiliser XML.

 HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
     doc.OptionFixNestedTags = true; 
     doc.Load("damn.html"); 

     //First off we find the nodes we want to collect data from. Note that we are only looking for a singlenode compared to your code where you find all nodes 
     //this could be cut down to selectnodes where we take all <li> tages with each div tag. But for simplicity. 
     HtmlNodeCollection favoritesContent = doc.DocumentNode.SelectNodes("//div[@id='favoritesContent']/div[@class='personListWrapper']/div[@class='gamerList']/ul//li"); 

     foreach (HtmlNode x in favoritesContent) 
     { 
      //here we find the gamertag which is an attribute in <li> if <li> does not have that value 
      //it will then return the deault value ""(empty string as specified) 
      string gamerTag = x.GetAttributeValue("data-gamertag", ""); 
      HtmlNode temp = x.SelectSingleNode("./a[@class='gamerpicWrapper']/*/img[@class='favorite']"); 
      string srcOnPic = temp.GetAttributeValue("src", "not found"); 
      string realName = x.SelectSingleNode("./descendant::*//div[@class='realName']").InnerText; 
      string primaryInfo = x.SelectSingleNode("./descendant::*//div[@class='primaryInfo']").InnerText; 

      if (0 < x.SelectSingleNode("./div[@class='statusIcon']").InnerHtml.Length) 
      { 
       bool online = true; 

      } 
     }