private bool StreetSelectionPredicate(Street s, Func<string, bool> filter, bool oldNames) { return filter(s.Title.ToLowerInvariant()) || (oldNames && s.PreviousNames.Exists(p => filter(p.ToLowerInvariant()))); }
private void ParseDetails(Street street) { if (street.Url != null) { HtmlDocument doc = null; int retryCount = 10; for (int i = 0; i < retryCount; i++) { try { var cacheFile = Path.Combine(CacheDirectory, street.Url.Substring(street.Url.LastIndexOf('/') + 1) + ".html"); string contents = null; if (File.Exists(cacheFile)) { contents = File.ReadAllText(cacheFile, Encoding.UTF8); } else { var http = new WebClient { Encoding = Encoding.UTF8, }; contents = http.DownloadString(street.Url); File.WriteAllText(cacheFile, contents, Encoding.UTF8); } doc = new HtmlDocument(); doc.LoadHtml(contents); break; } catch { if (i >= retryCount - 1) { throw; } Thread.Sleep(TimeSpan.FromSeconds(_random.Next(1, 10))); } } var content = doc.DocumentNode.SelectSingleNode(@"//*[@id=""mw-content-text""]/table[1]/tr[./td[contains(.,'Прежние')]]/td[2]"); if (content != null) { var separators = new[] { "\n", ", " }; street.PreviousNames.AddRange(content.InnerText.Split(separators, StringSplitOptions.None)); } content = doc.DocumentNode.SelectSingleNode(@"//*[@id=""mw-content-text""]/table[1]/tr[./td[contains(.,'Район')]]/td[2]"); if (content != null) { street.District = content.InnerText; } content = doc.DocumentNode.SelectSingleNode(@"//*[@id=""coordinates""]"); if (content != null) { street.Coordinate = GeoUtil.ParseCoordinate(content.InnerText); } } if (street.Coordinate == null) { street.Coordinate = GeoUtil.GetCoordinateByCode("Санкт-Петербург," + street.Title); } }