C# 如何使用HTMLabilityPack提取文本html属性

C# 如何使用HTMLabilityPack提取文本html属性,c#,html,discord.net,C#,Html,Discord.net,我需要从中提取突出显示的文本,我正在使用下面的代码,并得到对象引用错误未设置为对象的实例。我在指南中也使用了这个,它说使用Xpath表达式。我转到我想要的行,右键单击=>copy=>copy xpath。我得到了//[@id=“profile”]/div/div/div/div/div/div/div/text()”;我必须避开引号。如果我只做了//[@id=“profile”]”,那么它工作正常,我得到了个人资料,但我就是无法让它工作并获得统计数据 编辑:我需要的是获得排名值。但我不能简单地称

我需要从中提取突出显示的文本,我正在使用下面的代码,并得到对象引用错误未设置为对象的实例。我在指南中也使用了这个,它说使用Xpath表达式。我转到我想要的行,右键单击=>copy=>copy xpath。我得到了//[@id=“profile”]/div/div/div/div/div/div/div/text()”;我必须避开引号。如果我只做了//[@id=“profile”]”,那么它工作正常,我得到了个人资料,但我就是无法让它工作并获得统计数据

编辑:我需要的是获得排名值。但我不能简单地称之为排名,因为排名用于Solo、FPP Solo等。但我目前正在尝试获取“1510890”编号


编辑:我以前的答案不再有效,请阅读下面我的新发现


我认为你目前正在努力做的事情是不可能的

看起来,显示你的个人排名的数据(以及成吨的其他数据)是在加载HTML后加载的(这意味着浏览器中的javascript在下载HTML后处理一些数据绑定)

您可以通过两种方式自己进行测试:

  • 在代码中的
    HtmlDocument Doc=web.Load(path);
    行上放置一个调试器,检查
    Doc.DocumentNode.InnerHtml的值,将其复制并粘贴到记事本++或其他文本编辑器中,查看其中的数据。您会发现服务器没有加载您的排名(即它在源HTML中不可用)

  • 与其在Chrome中检查页面上的元素,不如右键单击并“查看源代码”。这与HtmlAgilityPack在将HTML“加载”到对象中时看到的数据相同。它不允许运行javascript(意味着您的值从未绑定到任何HTML)

  • 我能看到的收集所需数据的唯一方法是从服务器获取源代码中嵌入的javascript对象。您将在文档末尾的
    标记中看到它。它是一个巨大的javscript对象,其中包含您的排名


    您可以通过查看我上面解释的源代码,并对您的排名执行Ctrl+F组合键来看到这一点。您将看到它显示在对象中的两个位置。

    看起来类为“rank”的
    只在文档中出现一次,为什么不使用
    “//div[contains(@class,'rank')抓住它呢“
    rank在//*[@id=“profile”]/div[2]/div[2]/div[1]/div[4]/div[1]/div[1]/div/text()中有5个以上的实例使用。如果我尝试调用“rank”,它也会再次用于solofpp。您需要一个带有class=“rank”的特定div吗?”?在示例codeObject引用中,您似乎正在迭代所有未设置为对象实例的代码对象引用。当我尝试此确定时,该异常是在哪一行引发的?Console.WriteLine(soloRankNode.InnerText);具有错误HtmlNode soloNode=Doc.DocumentNode.SelectSingleNode(//span[text()='Solo']);实际上有错误吗sorry@JacobLenertz首先,为什么要删除HTML?他们有一个.Go注册表,然后向“”发出GET请求
    [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); 
            }                    
        }
    }