user2368363
user2368363

Reputation: 309

c# HtmlAgilityPack and Yahoo's HTML

So I am goofing off and wrote something that first queries other websites and loads all of the pertinent stock exchange symbols and the tries to iterate through the symbols and load Yahoo's server for the latest stock price. For some reason no matter what I try to search by using HtmlAgilityPack, I can't seem to get any pertinent info back. I don't think there's an issue with some javascript running after the page is loaded (but I could be wrong).

The following is a generalized routine that can be tinkered with to try and get the percentage change of the stock symbol back from Yahoo:

                string symbol = "stock symbol"    
                string link = @"http://finance.yahoo.com/q?uhb=uh3_finance_vert&s=" + symbol;

                string data = String.Empty;
                try
                {
                    // keep in this scope so wedget and doc deconstruct themselves
                    var webget = new HtmlWeb();
                    var doc = webget.Load(link);
                    string percGrn = doc.FindInnerHtml("//span[@id='yfs_pp0_" + symbol + "']//b[@class='yfi-price-change-up']");
                    string percRed = doc.FindInnerHtml("//span[@id='yfs_pp0_" + symbol + "']//b[@class='yfi-price-change-down']");

                    // create somthing we'll nuderstand later
                    if ((String.IsNullOrEmpty(percGrn) && String.IsNullOrEmpty(percRed)) ||
                        (!String.IsNullOrEmpty(percGrn) && !String.IsNullOrEmpty(percRed))) 
                        throw new Exception();

                    // adding string to empty gives string
                    string perc = percGrn + percRed;
                    bool isNegative = String.IsNullOrEmpty(percGrn);
                    double percDouble;

                    if (double.TryParse(Regex.Match(perc, @"\d+([.])?(\d+)?").Value, out percDouble))
                        data = (isNegative ? 0 - percDouble : percDouble).ToString();
                }
                catch (Exception ex) { }
                finally
                {
                    // now we need to check what we have and load into the datgridView
                    if (!newData_d.ContainsKey(symbol)) newData_d.Add(symbol, data);
                    else MessageBox.Show("ERROR: Duplicate stock Symbols for: " + symbol);
                }

And here is the extended method for FindInnerHtml:

// this is for the html agility class
    public static string FindInnerHtml( this HtmlAgilityPack.HtmlDocument _doc, string _options)
    {
            var node = _doc.DocumentNode.SelectSingleNode(_options);
            return (node != null ? node.InnerText.ToString() : String.Empty);
    }

Any help with getting something back would be appreciated, thanks!

/////////////////////////////////////// EDIT: ///////////////////////////////////////

I highlighted the span id and then check out line 239 for where I saw 'yfi-price-change-up' reference:

enter image description here

Upvotes: 0

Views: 429

Answers (1)

har07
har07

Reputation: 89285

The following XPath successfully find the target <span> which contains percentage of increase (or decrease) :

var doc = new HtmlWeb().Load("http://finance.yahoo.com/q?uhb=uh3_finance_vert&s=msft");
var xpath = "//span[contains(@class,'time_rtq_content')]/span[2]";
var span = doc.DocumentNode.SelectSingleNode(xpath);
Console.WriteLine(span.InnerText);

output :

(0.60%)

Upvotes: 1

Related Questions