没有从span获得正确的数据

时间:2015-11-16 07:30:31

标签: c# html-agility-pack

我一直在为Jessecar的SteamBot制作一个自定义用户处理程序,这与我遇到的问题无关,但基本上我所做的是,我是'我做了它,所以你可以设置机器人按照应用程序ID玩一个特定的游戏,我一直在使用这个来为Steam交易卡的游戏闲置,唯一的问题是,我能检查它的唯一方法&# 39;完成后,通过检查它的库存以及应该丢弃多少张牌,这不是太麻烦,但我创造这个的主要原因是效率,并且这样做每次失败它的目的。

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

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,但是,使用这些卡,它看起来像是"没有卡片掉落"或"卡片丢弃剩余"它也没有得到,我尝试使用与小时相同的方法,只有得到它,如果它是一个数字,它仍然返回" 0",同样的结果为此...

我再次尝试检查字符串是否为空,因为这可能意味着没有卡片丢失,因为没有数字,我也在网上查看获取范围内的数据的方法div或span数据一般,并且两种方法都不起作用,它们只是返回" 0"。如果你还不能说,我确实有HTML Agility Pack。

2 个答案:

答案 0 :(得分:1)

您需要更具体地了解要选择的节点。我强烈反对你不要使用正则表达式来尝试导航htmldocument的innertext或innerhtml。 查找HTmlNodes,了解是否还有卡片要丢弃。尝试使用这个xpath:

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

这些节点将包含文本:

"没有卡丢失"

数+"卡片丢弃剩余"

答案 1 :(得分:1)

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

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,因为您可以使用它从您的网页开始一个蒸汽游戏。

记住我在第一个答案中给你的xpath,也用在上面的代码中找到ALL(" //"),它的类等于" progress_info_bold&#34 ;