Verwenden von HtmlAgilityPack, um bestimmte Daten in C # zu erhalten und sie nach json zu serialisieren

c# html html-agility-pack json visual-studio

Frage

Ich habe einen HTML-Quellcode heruntergeladen, und ich versuche, einige Daten daraus zu erhalten, um es in eine "JSON" -Datei zu serialisieren.

Dies ist die HTML-Quelldatei: https://drive.google.com/file/d/0BzweTZsfeoxMTWk2LVdnYTJMRUE/view?usp=sharing

Im HTML-Code gibt es "2" Gruppen, von denen ich Daten sammeln möchte.

Im Moment habe ich es geschafft, den Code innerhalb dieser "2" -Gruppen zu bekommen und ihn in zwei Panels mit Labels anzuzeigen. Mein Code ist wie eine Brache:

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

    }
}

Von diesen zwei Gruppen möchte ich die Benutzer in ihnen sammeln und für jeden Benutzer ihre jeweiligen Daten, um sie in eine JSON-Datei zu serialisieren.

Jeder Benutzer wird durch <li ...></li>

Für jeden Benutzer, den ich bekommen möchte:

  • Gamertag: data-gamertag="this is the gamertag"
  • Gamerpic: es ist in der class="gamerpicWrapper" der 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"> Wenn hier Code vorhanden ist, wird dieser Wert in der json-Datei wahr </div>

Dies ist ein Beispiel für das gewünschte "json" -Dateiformat (Beachten Sie, dass der folgende Code wahrscheinlich schlecht geschrieben ist.):

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

    }
}

Ich würde es sehr schätzen, wenn mir jemand zeigen könnte, wie ich das mache.

Beliebte Antwort

Der folgende Code zeigt eine angemessene Verwendung von Xpath und HAP. Die Verwendung von xpath kann vereinfacht werden, aber Sie gaben mir 4k HTML-Dateien und ich habe keine Lust, die Struktur von allem zu lernen. Der Code erhält jedoch alle gewünschten Variablen. Jetzt ist es Ihre Aufgabe, eine JSON-Struktur zu erstellen. Wenn Sie jedoch keine JSON-Kenntnisse haben, sollten Sie XML verwenden.

        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;

            }
        }



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum