如何使用 HTMLabilityPack 提取文本 html 属性
How To pull a text html attribute using HTMLabilityPack
我需要从此 Site I am using the code below and getting the error of Object reference not set to an instance of an object. I am Also using this Guide in the guide it says use Xpath expression. I go to the line i want and right click => copy => copy xpath. I get //[@id="profile"]/div2/div2/div1/div1/div1/div1/div/text()"); 中提取突出显示的文本;我必须转义引号。如果我只是做 "//[@ id="profile"]" 然后它工作正常,我得到了配置文件,但我无法让它工作并获得统计数据。
编辑:我需要的是获得排名值。但我不能简单地称之为一个等级,因为等级用于 Solo、FPP Solo 等。但我目前正在尝试获取他的“1,510,890”号码。
[Command("test")]
[Alias("ti")]
public async Task Stats(string name)
{
string path = "https://pubgtracker.com/profile/pc/" + name + "?region=agg";
HtmlWeb web = new HtmlWeb();
HtmlDocument Doc = web.Load(path);
var htmlNodes = Doc.DocumentNode
.SelectNodes("//*[@id=\"profile\"]/div[2]/div[2]/div[1]/div[1]/div[1]/div[1]/div/text()");
foreach (var node in htmlNodes)
{
foreach (var att in node.Attributes)
{
Console.WriteLine(att.Value);
}
}
}
编辑:我之前的回答不再有效,请阅读下面我的新发现。
我认为你目前正在尝试做的事情是不可能的。
显示您的单排排名的数据(以及大量其他数据)似乎是在加载 HTML 之后加载的(这意味着浏览器中的 javascript 正在处理一些下载 html 后的数据绑定)。
您可以通过两种方式自行测试:
在代码中的 HtmlDocument Doc = web.Load(path);
行放置一个调试器,并检查 Doc.DocumentNode.InnerHtml
的值,将其复制并粘贴到 Notepad++ 或其他文本编辑器中,然后查看数据就在那里。你会发现你的排名没有被服务器加载(即它在源中不可用HTML)
不要在 Chrome 中检查页面上的元素,而是右键单击并 "View Source"。这与 HtmlAgilityPack 在将 "loads" HTML 放入对象时看到的数据相同。它不允许 javascript 到 运行(这意味着您的值永远不会绑定到任何 HTML)。
我认为收集所需数据的唯一 方法是从服务器获取嵌入在源中的javascript 对象。您会在文档末尾的 <script>
标记中看到它。它是一个 giant javscript 对象,(除其他外)包含您的排名。
您可以像我上面解释的那样查看源代码,然后按 Ctrl+F 为您的排名亲眼看到这一点。您会看到它出现在对象的两个位置。
我需要从此 Site I am using the code below and getting the error of Object reference not set to an instance of an object. I am Also using this Guide in the guide it says use Xpath expression. I go to the line i want and right click => copy => copy xpath. I get //[@id="profile"]/div2/div2/div1/div1/div1/div1/div/text()"); 中提取突出显示的文本;我必须转义引号。如果我只是做 "//[@ id="profile"]" 然后它工作正常,我得到了配置文件,但我无法让它工作并获得统计数据。
编辑:我需要的是获得排名值。但我不能简单地称之为一个等级,因为等级用于 Solo、FPP Solo 等。但我目前正在尝试获取他的“1,510,890”号码。
[Command("test")]
[Alias("ti")]
public async Task Stats(string name)
{
string path = "https://pubgtracker.com/profile/pc/" + name + "?region=agg";
HtmlWeb web = new HtmlWeb();
HtmlDocument Doc = web.Load(path);
var htmlNodes = Doc.DocumentNode
.SelectNodes("//*[@id=\"profile\"]/div[2]/div[2]/div[1]/div[1]/div[1]/div[1]/div/text()");
foreach (var node in htmlNodes)
{
foreach (var att in node.Attributes)
{
Console.WriteLine(att.Value);
}
}
}
编辑:我之前的回答不再有效,请阅读下面我的新发现。
我认为你目前正在尝试做的事情是不可能的。
显示您的单排排名的数据(以及大量其他数据)似乎是在加载 HTML 之后加载的(这意味着浏览器中的 javascript 正在处理一些下载 html 后的数据绑定)。
您可以通过两种方式自行测试:
在代码中的
HtmlDocument Doc = web.Load(path);
行放置一个调试器,并检查Doc.DocumentNode.InnerHtml
的值,将其复制并粘贴到 Notepad++ 或其他文本编辑器中,然后查看数据就在那里。你会发现你的排名没有被服务器加载(即它在源中不可用HTML)不要在 Chrome 中检查页面上的元素,而是右键单击并 "View Source"。这与 HtmlAgilityPack 在将 "loads" HTML 放入对象时看到的数据相同。它不允许 javascript 到 运行(这意味着您的值永远不会绑定到任何 HTML)。
我认为收集所需数据的唯一 方法是从服务器获取嵌入在源中的javascript 对象。您会在文档末尾的 <script>
标记中看到它。它是一个 giant javscript 对象,(除其他外)包含您的排名。
您可以像我上面解释的那样查看源代码,然后按 Ctrl+F 为您的排名亲眼看到这一点。您会看到它出现在对象的两个位置。