private void SetDifferenceFromMedianTarget(string difference, ScraperAnalysis analysis) { var positive = true; decimal percentageChange = 0m; var trimChars = new char[3] { '+', '-', '%' }; if (difference.IndexOf('-') == 0) { positive = false; } difference = difference.Trim(trimChars); bool isParsable = Decimal.TryParse(difference, out percentageChange); if (isParsable) { if (positive) { analysis.DifferenceFromMedianPercentage = percentageChange; } else { analysis.DifferenceFromMedianPercentage = percentageChange * (-1); } } }
private void SetCurrentRecommendation(IElement analysisText, ScraperAnalysis analysis) { var regex = new Regex("\\<[^\\>]*\\>"); var recommendation = regex.Replace(analysisText.InnerHtml, String.Empty); analysis.CurrentRecommendation = recommendation; }
private void SetLowMedianHighEstimates(IElement analysisText, ScraperAnalysis analysis) { var text = analysisText.InnerHtml; var percentage = analysisText.Children.Length > 0 ? analysisText.Children[0].InnerHtml : "0"; SetDifferenceFromMedianTarget(percentage, analysis); var words = text.Split(' '); for (var i = 0; i < words.Length; i++) { if ((i != 0) && (i != words.Length - 1)) { if (words[i - 1] == "The" && words[i + 1] == "analysts") { int numberOfAnalysts = 0; bool isParsable = Int32.TryParse(words[i], out numberOfAnalysts); if (isParsable) { analysis.NumberOfAnalysts = numberOfAnalysts; } i++; } if (words[i] == "median" && words[i + 1] == "target" && words[i + 2] == "of") { decimal medianTarget = 0m; bool isParsable = Decimal.TryParse(words[i + 3].TrimEnd(','), out medianTarget); if (isParsable) { analysis.MedianTarget = medianTarget; } i = i + 3; } if (words[i] == "high" && words[i + 1] == "estimate" && words[i + 2] == "of") { decimal highEstimate = 0m; bool isParsable = Decimal.TryParse(words[i + 3], out highEstimate); if (isParsable) { analysis.HighTarget = highEstimate; } i = i + 3; } if (words[i] == "low" && words[i + 1] == "estimate" && words[i + 2] == "of") { decimal lowEstimate = 0m; bool isParsable = Decimal.TryParse(words[i + 3].TrimEnd('.'), out lowEstimate); if (isParsable) { analysis.LowTarget = lowEstimate; } i = i + 3; } } } }
private async Task <ScraperAnalysis> GetAnalystView(HttpResponseMessage request) { const string lastPriceClassName = "wsod_last"; const string fiftyTwoWeekHighClassName = "val hi"; const string fiftyTwoWeekLowClassName = "val lo"; const string forecastId = "wsod_forecasts"; const string tickerNodeClassName = "wsod_smallSubHeading"; var scrapAnalysis = new ScraperAnalysis(); var response = await request.Content.ReadAsStreamAsync(); var parser = new HtmlParser(); var document = parser.ParseDocument(response); var tickerNodes = document.GetElementsByClassName(tickerNodeClassName); INode tickerNode = null; if (tickerNodes.Length > 0) { tickerNode = tickerNodes[0]; } SetTicker(scrapAnalysis, (IElement)tickerNode); var lastPriceNodes = document.GetElementsByClassName(lastPriceClassName); INode lastPriceNode = null; if (lastPriceNodes.Length > 0) { lastPriceNode = lastPriceNodes[0].FirstChild; } SetCurrentPrice(scrapAnalysis, (IElement)lastPriceNode); var fiftyTwoWeekHighNodes = document.GetElementsByClassName(fiftyTwoWeekHighClassName); INode fiftyTwoWeekHighNode = null; if (fiftyTwoWeekHighNodes.Length > 0) { fiftyTwoWeekHighNode = fiftyTwoWeekHighNodes[0]; } SetFiftyTwoWeekHigh(scrapAnalysis, (IElement)fiftyTwoWeekHighNode); var fiftyTwoWeekLowNodes = document.GetElementsByClassName(fiftyTwoWeekLowClassName); INode fiftyTwoWeekLowNode = null; if (fiftyTwoWeekLowNodes.Length > 0) { fiftyTwoWeekLowNode = fiftyTwoWeekLowNodes[0]; } SetFiftyTwoWeekLow(scrapAnalysis, (IElement)fiftyTwoWeekLowNode); var forecast = document.GetElementById(forecastId); SetAnalystRatings(scrapAnalysis, forecast); return(scrapAnalysis); }
private void SetCurrentPrice(ScraperAnalysis analysis, IElement currentPrice) { if (currentPrice != null) { var valueText = currentPrice.InnerHtml; var value = 0.0m; if (Decimal.TryParse(valueText, out value)) { analysis.CurrentPrice = value; } } }
private void SetTicker(ScraperAnalysis analysis, IElement ticker) { if (ticker != null) { var exchangeAndTickerName = ticker.InnerHtml; var unformattedTickerName = exchangeAndTickerName.Split(':'); if (unformattedTickerName.Length >= 2) { analysis.Ticker = unformattedTickerName[1].TrimEnd(')'); } } }
private void SetFiftyTwoWeekHigh(ScraperAnalysis analysis, IElement fiftyTwoWeekHigh) { if (fiftyTwoWeekHigh != null) { var valueText = fiftyTwoWeekHigh.InnerHtml; var value = 0.0m; if (Decimal.TryParse(valueText, out value)) { analysis.FiftyTwoWeekHigh = value; analysis.DecreaseFromFiftyTwoWeekHigh = analysis.FiftyTwoWeekHigh - analysis.CurrentPrice; analysis.DecreaseFromFiftyTwoWeekHighPercentage = Decimal.Round(((analysis.DecreaseFromFiftyTwoWeekHigh / analysis.FiftyTwoWeekHigh) * 100), 2); } } }
private void SetFiftyTwoWeekLow(ScraperAnalysis analysis, IElement fiftyTwoWeekLow) { if (fiftyTwoWeekLow != null) { var valueText = fiftyTwoWeekLow.InnerHtml; var value = 0.0m; if (Decimal.TryParse(valueText, out value)) { analysis.FiftyTwoWeekLow = value; analysis.IncreaseFromFiftyTwoWeekLow = analysis.CurrentPrice - analysis.FiftyTwoWeekLow; analysis.IncreaseFromFiftyTwoWeekLowPercentage = Decimal.Round(((analysis.IncreaseFromFiftyTwoWeekLow / analysis.FiftyTwoWeekLow) * 100), 2); } } }
private void SetAnalystRatings(ScraperAnalysis analysis, IElement forecast) { if (forecast != null) { var analysisText = forecast.GetElementsByTagName("p"); for (var j = 0; j < analysisText.Length; j++) { if (j == 0) { SetLowMedianHighEstimates(analysisText[0], analysis); } if (j == 1) { SetCurrentRecommendation(analysisText[1], analysis); break; } } } }