HtmlAgilityPackを使用してC#で特定のデータを取得し、jsonにシリアル化する

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

質問

私はHTMLのソースコードをダウンロードして、それを "json"ファイルにシリアル化するためにいくつかのデータを取得しようとしています。

これはhtmlソースファイルです: https : //drive.google.com/file/d/0BzweTZsfeoxMTWk2LVdnYTJMRUE/view?usp=sharing

htmlコードには、データを収集したい "2"グループがあります。

現時点では、私はこの "2"グループ内のコードを取得し、ラベルを使用して2つのパネルに表示しました。私のコードは落ち着いている:

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

    }
}

この2つのグループから、私はそれらのユーザーと各ユーザーのために、それぞれのデータをjsonファイルにシリアル化するユーザーを収集したいと考えています。

各ユーザーは<li ...></li>

取得したいユーザーごとに:

  • ゲーマータグ: data-gamertag="this is the gamertag"
  • Gamerpic: class="gamerpicWrapper" src="this is the gamerpic"
  • 実名: <div class="realName">this is the realname</div>
  • PrimaryInfo: <div class="primaryInfo">this is the primaryinfo</div>
  • isOnline: <div class="statusIcon">ここにコードがある場合、jsonファイルにこの値がtrueになります。 </div>

これは、希望する "json"ファイル形式の例です(休止状態のコードはおそらく書き留めていることに注意してください)。

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

    }
}

もし誰かが私にこのことをどうやって見せることができたら大いに感謝します。

人気のある回答

次のコードは、xpathとHAPの適切な使用法を示しています。 xpathの使用法は単純化することができますが、あなたは私に4k htmlファイルを与えました。そして、私はすべての構造を学ぶ気がしません。しかし、コードはあなたが必要とするすべてを変数として取得します。今はJSON構造にするのはあなたの仕事ですが、JSONについて知識がなければ、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;

            }
        }



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ