Я загрузил исходный код html, и я пытаюсь получить некоторые данные из него, чтобы сериализовать его в файл «json».
Это исходный файл html: https://drive.google.com/file/d/0BzweTZsfeoxMTWk2LVdnYTJMRUE/view?usp=sharing
В html-коде есть группы «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;
}
}
}
Из этих двух групп я хочу собрать пользователей в них и для каждого пользователя, их соответствующие данные, чтобы сериализовать его в json-файл.
Каждый пользователь разделяется <li ...></li>
Для каждого пользователя, которого я хочу получить:
data-gamertag="this is the gamertag"
class="gamerpicWrapper"
src="this is the gamerpic"
<div class="realName">this is the realname</div>
<div class="primaryInfo">this is the primaryinfo</div>
<div class="statusIcon">
если здесь есть код, то в json-файле это значение будет true </div>
Это пример желаемого формата файла «json» (обратите внимание, что код ошибки, вероятно, плохо написан.):
{
"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,
}
]
}
Я был бы очень признателен, если бы кто-нибудь мог показать мне, как это сделать.
Следующий код показывает соответствующее использование 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;
}
}