コード例 #1
0
ファイル: RBParser.cs プロジェクト: StepanSolovyev/pbn
        public emitent GetEmitentData(string idemitent) //получение ИНН эмитента
        {
            emitent Emit = new emitent();
            string  XP   = "http://www.rusbonds.ru/ank_org.asp?emit=" + idemitent;

            //RusB = featuredArticle.GetAttributeValue("href", null);
            try
            {
                HtmlAgilityPack.HtmlWeb web1 = new HtmlWeb();
                web1.OverrideEncoding = Encoding.GetEncoding("Windows-1251");
                HtmlAgilityPack.HtmlDocument doc1 = web1.Load(XP);
                Emit.emit = int.Parse(idemitent);
                Emit.inn  = 0;
                try
                {
                    Emit.inn = ulong.Parse(doc1.DocumentNode.SelectSingleNode("/html//body/table[4]//tbody/tr[6]/td[2]").InnerText.Replace(" ", ""));
                }
                catch
                {
                    if (Emit.inn == 0)
                    {
                        try
                        {
                            Emit.inn = ulong.Parse(doc1.DocumentNode.SelectSingleNode("/html//body/table[4]//tbody/tr[7]/td[2]").InnerText.Replace(" ", ""));
                        }
                        catch
                        { Emit.inn = 0; }
                    }
                }
                return(Emit);
            }
            catch {
                Emit.inn = 0;
                Console.WriteLine("the page of Emitent not found");
                return(Emit);
            }
        }
コード例 #2
0
        /// <summary>
        ///  Главный метод класса. Возвращает массив структур с заполненными данными по каждому эмитенту в нём.
        ///  <returns>Возвращает массив emitent[].</returns>
        /// </summary>
        public emitent[] Start()
        {
            // определяет кол-во страниц в мультистраничном гриде веб страницы
            int PageCounter = this.GetPageCounter("http://www.rusbonds.ru/srch_emitent.asp?emit=0&cat=0&rg=0&rate=0&stat=0&go=0&s=5&d=0&p=1#rslt1#rslt");

            // определяет кол-во строк на каждой странице грида
            int RowCounter = this.GetRowCounter("http://www.rusbonds.ru/srch_emitent.asp?emit=0&cat=0&rg=0&rate=0&stat=0&go=0&s=5&d=0&p=1#rslt");

            //определение масива структур , его размера (общее количесто эмитентов)
            emitent[] EmitentArrayToReturn = new emitent[RowCounter * PageCounter];

            // определяем начальные значения для дальнейшей итерации по многостраничному гриду и массиву эимтентов
            int CurrentPageIndex         = 1;
            int CurrentRowIndex          = 1;
            int ArrayCurrentElementIndex = 0; // будущий итератор для EmitentArrayToReturn

#if DEBUG
            CurrentPageIndex = 1;
#endif
            //выгрузка данных из таблицы постранично и построчно из каждой страницы грида
            do
            {
                try
                {
                    HtmlWeb CurrentHTMLPage = new HtmlWeb
                    {
                        OverrideEncoding = Encoding.GetEncoding("Windows-1251")
                    };

                    // получает веб страницу с гридом для парсинга
                    HtmlAgilityPack.HtmlDocument CurrentHTMLPageAsDoc = CurrentHTMLPage.Load("http://www.rusbonds.ru/srch_emitent.asp?emit=0&cat=0&rg=0&rate=0&stat=0&go=0&s=5&d=0&p=" +
                                                                                             CurrentPageIndex + "#rslt");

                    do
                    {
                        foreach (HtmlNode row in CurrentHTMLPageAsDoc.DocumentNode.SelectNodes("/html/body/div[1]/table[2]/tbody/tr[" + CurrentRowIndex + "]"))
                        {
                            if (row != null)
                            {
#if DEBUG
                                Console.WriteLine(ArrayCurrentElementIndex + "\t" + Math.Round(((double)ArrayCurrentElementIndex / ((double)RowCounter * (double)PageCounter)) * 100, 2) +
                                                  "%\tof " + RowCounter * PageCounter);
#endif
                                //получает из строки грида ссылку на эмитент вида "http://www.rusbonds.ru/ank_org.asp?emit=78881"
                                HtmlNode mhref    = row.SelectSingleNode("td[2]/a");
                                string   emithref = mhref.GetAttributeValue("href", null);
                                EmitentArrayToReturn[ArrayCurrentElementIndex] = this.GetEmitentData(emithref);

                                CurrentRowIndex++;
                            }
                        }
                        ArrayCurrentElementIndex++;
                    }
                    //проверка конца массива строк на странице - условие перехода на новую страницу
                    while (CurrentRowIndex <= RowCounter);
                    CurrentPageIndex++;

                    //сброс счетчика строк грида при переходе на новую страницу
                    CurrentRowIndex = 1;
                }
                catch (Exception ex)
                {
#if DEBUG
                    Console.WriteLine(ex.Message + ex.TargetSite);
#endif
                    break;
                }
            }while (CurrentPageIndex != 300);//заведомо большое число страниц

#if DEBUG
            Console.WriteLine("Total Emitent count is " + EmitentArrayToReturn.Count());
#endif
            #region RemoveEmptyDataFromArray
            // зачищаем массив перед его возвратом
            // критерий - присутствие 2х полей - имя эимтента не пустое и
            EmitentArrayToReturn = EmitentArrayToReturn.Where(CurrentEmitent => !string.IsNullOrEmpty(CurrentEmitent.Issuer)).ToArray();
            #endregion
#if DEBUG
            Console.WriteLine("Purged Emitent count is " + EmitentArrayToReturn.Count());
#endif
            return(EmitentArrayToReturn);
        }
コード例 #3
0
        /// <summary>
        ///  Получение данных об эмитенте
        /// </summary>
        /// <param name="emithref">Относительный URL на странице которого находится грид с анкетой компании</param>
        emitent GetEmitentData(string emithref)
        {
            emitent Emit           = new emitent(int.Parse(emithref.Split('=')[1]));
            string  FullEmitentUrl = "http://www.rusbonds.ru" + emithref;

            try
            {
                HtmlAgilityPack.HtmlWeb web1 = new HtmlWeb();
                web1.OverrideEncoding = Encoding.GetEncoding("Windows-1251");
                HtmlAgilityPack.HtmlDocument doc1 = web1.Load(FullEmitentUrl);
                //Emit.emit = int.Parse(idemitent);

                HtmlNodeCollection EmitentInfo = doc1.DocumentNode.SelectNodes("/html//body/table[4]//tbody/tr");
                foreach (HtmlNode node in EmitentInfo)
                {
                    string swch = node.InnerText.Split(':')[0];
                    switch (swch)
                    {
                    case "Наименование":
                        Emit.Issuer = node.InnerText.Split(':')[1];
                        break;

                    case "Основной ОКВЭД":
                        Emit.TypeOfBusiness = node.InnerText.Split(':')[1];
                        break;

                    case "Страна":
                        Emit.Country = node.InnerText.Split(':')[1];
                        break;

                    case "Регион":
                        Emit.Region = node.InnerText.Split(':')[1];
                        break;

                    case "ИНН":
                        Emit.INN = ulong.Parse(node.InnerText.Split(':')[1]);
                        break;

                    case "ОКПО или др.":
                        Emit.OKPO = node.InnerText.Split(':')[1];
                        break;

                    case "Данные госрегистрации":
                        Emit.GosRegData = node.InnerText.Split(':')[1];
                        break;

                    case "Юридический адрес":
                        Emit.LowAddress = node.InnerText.Split(':')[1];
                        break;

                    case "Почтовый адрес":
                        Emit.MailingAddress = node.InnerText.Split(':')[1];
                        break;

                    case "Вид собственности":
                        Emit.TypeOfProperty = node.InnerText.Split(':')[1];
                        break;

                    case "Уставный капитал":
                        string[] U = this.GetCapital(node.InnerText.Split(':')[1]);                 //вытягиваем число с пробелами из уставного капитала до букв валюты
                        Emit.CharterCapital = ulong.Parse(U[0].Replace(" ", String.Empty));         // удаляем пробелы из числа

                        string[] V = this.Сurrency(node.InnerText.Split(':')[1]);                   //вытягиваем валюту из уставного капитала
                        Emit.CharterCapitalCurrency = (V[V.Length - 1].Replace(" ", String.Empty)); // удаляем пробелы из числа
                        break;

                    default:
                        break;
                    }
                }

                return(Emit);
            }
            catch (Exception e)
            {
#if DEBUG
                Console.WriteLine(e.Message + " " + FullEmitentUrl);
#endif
                // on error just return data "as is"
                return(Emit);
            }
        }