没有从 span 获取正确的数据

Not getting correct data from span

我一直在为 Jessecar 的 SteamBot 创建一个自定义用户处理程序,这与我遇到的问题无关,但基本上我所做的是,我已经做到了,所以你可以将机器人设置为通过 App ID 玩特定游戏,我一直在使用它来闲置 Steam 集换式卡牌游戏,唯一的问题是,我可以检查它是否完成的唯一方法是检查它的库存以及应该有多少张卡牌drop,这不是太麻烦,但我创建它的主要原因是为了提高效率,每次都这样做有点违背它的目的。

因此,我尝试从机器人正在玩的游戏的徽章页面获取数据,这就是我目前所拥有的...

else if (message.StartsWith(".updateidle"))
            {
                var webGet = new HtmlWeb();
                var SteamID64 = Bot.SteamClient.SteamID.ConvertToUInt64();
                string htmlget = "http://www.steamcommunity.com/profiles/" + SteamID64 + "/gamecards/" + newgame;
                var doc = webGet.Load(htmlget);

                HtmlNode hoursNode = doc.DocumentNode.SelectSingleNode("//div[@class=\"badge_title_stats_playtime\"]");
                string hours = Regex.Match(hoursNode.InnerText, @"[0-9\.,]+").Value;

                var cards = doc.DocumentNode.SelectSingleNode("div[@class='badge_title_stats_drops']/span").InnerText;



                if (hours == string.Empty)
                {
                    hours = "0.0";
                }

                Bot.SteamFriends.SendChatMessage(OtherSID, type, "I have been idling for " + hours + " hours on game " + newgame + " and have " + cards + " card drops remaining.");
            }

获取时间工作正常,如果机器人没有时间玩那个游戏,它不会出现,所以我只是检查它是否为空然后将它设置为 0.0,但是,对于卡片,它显示为"No card drops remaining" 或“剩余卡片掉落”,它也没有得到,我尝试使用与小时相同的方法,只有当它是一个数字时才得到它,它仍然是 returns 和“0” , 同样的结果...

我也再次尝试检查字符串是否为空,因为这可能意味着没有剩余的卡片掉落,因为没有数字,我还在网上查看了获取跨度数据的方法在 div 或一般跨度数据中,两种方法都不起作用,它们只是 return 和“0”。如果你还不知道,我有 HTML Agility Pack。

您需要更具体地选择要选择的节点。我强烈建议您不要使用正则表达式来尝试导航 html 文档的 innertext 或 innerhtml。 查找有关是否还有要丢弃的卡片的 HTMLNodes。尝试使用这个 xpath:

"//span[@class='progress_info_bold']"

这些节点将包含文本:

"No card drops remaining"

number+" 卡牌掉落剩余

所以在我之前的回答中,我决定不编辑,因为这里的后续内容会很大。为此,我同时使用了 Selenium 和 Html Agility Pack。首先,我使用 Selenium 登录(顺便说一句,我使用的是 Mono)。之后我手动输入授权我的电脑(如果你的电脑已经被授权则跳过这一步)然后转到控制台并按任意键继续获取卡信息。在这种情况下,我将收集所有游戏的卡片信息。我无法确定哪个游戏仍然有卡牌掉落,因为它还没有实现。

class MainClass
{


    public static void Main(string[] args)
    {
        string userName = "username";
        string password ="password";
        string steamProfile = "steamprofile";
        HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();


        using (var driver = new FirefoxDriver())
        {

            // Go to the home page
            driver.Navigate().GoToUrl("https://store.steampowered.com//login/?redir=0");

            // Get the page elements
            var userNameField = driver.FindElementById("input_username");
            var userPasswordField = driver.FindElementById("input_password");
            //var loginButton = driver.FindElementById("login_btn_signin");
            var loginButton = driver.FindElementByXPath("//button[@class='btnv6_blue_hoverfade  btn_medium']");

            // Type user name and password
            userNameField.SendKeys(userName);
            userPasswordField.SendKeys(password);

            // and click the login button
            loginButton.Click();
            System.Threading.Thread.Sleep(5000);

            //Type authorization code and enter manually.

            System.Console.ReadKey();

            driver.Navigate().GoToUrl("http://steamcommunity.com/profiles/"+steamProfile+"/badges");


            driver.GetScreenshot().SaveAsFile(@"screen.png", ImageFormat.Png); //Debuggin purposes, as I was first using PhantomJS


            htmlDoc.LoadHtml(driver.PageSource);

            Console.Clear();

        }

        HtmlNodeCollection col = htmlDoc.DocumentNode.SelectNodes("//span[@class='progress_info_bold']");

        foreach (HtmlNode n in col)
        {
            Console.WriteLine(n.InnerText);
        }
    }
}

}

我的输出结果

5 of 29 tasks completed
No card drops remaining
No card drops remaining
No card drops remaining
4 card drops remaining
3 card drops remaining

此代码还会为您提供徽章进度。您必须自己弄清楚如何在 Html Agility Pack 中过滤数据(阅读 xpath)。我还建议您使用 Selenium,因为您可以使用它从您的网页启动 steamgame。

记住我在第一个答案中给你的 xpath 也用在上面的代码中找到 ALL("//") 有一个 class 等于 "progress_info_bold".