Парсинг html + javascript - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Я хочу написать парсер, чтобы получать нужную информацию с сайта для дальнейшей работы с ней. Начал изучать, нашел множество примеров, которые внятно поясняют, что и как делать, но не подходит для моего варианта. Проблема в том, что информация, которая нужна мне, выводится через javascript и при парсинге страницы, парсится все, кроме таблицы с нужной информацией (вместо нее надпись "Loading..."). Как решить данную проблему, поделитесь знаниями и опытом? P.S. Сайт получает информацию поэтапно, как я понял, прочитав пару тем. Есть парсер этого сайта для Excel, и там такой метод получения

(нужной мне)

информации, в три этапа: 1. "Открыть сайт site.ru в IE", 2. "Прокрутить страницу вниз" 3. "Закрыть IE". Для удобства есть окошко с кодом, полученным с сайта, в нем есть весь код в html, даже тот, что получается через javascript. Если есть подобные команды для c#, php, буду очень признателен. P.P.S. Язык программирования по сути не важен, но отдаю предпочтение C# дабы парсер был в виде *.exe программы с выводом данных в Excel или txt. P.P.P.S Извиняюсь за такой фанатизм к описанию данной темы. Самое главное - как мне получить эту информацию, есть ли варианты, как в Excel парсере?

Решение задачи: «Парсинг html + javascript»

textual
Листинг программы
public class ExcelMaker : IExcelMaker
    {
        public async void ToMakeExcel(Task<IEnumerable<Bill>> xmls, Task<object[,]> excel)
        => await Task.Run( async() =>
        {
            #region XmlToArray
            var _xmls = await xmls;
            var xmlData = _xmls.Select(xml =>
            {
                ExcelData ExcelData = new ExcelData();
                ExcelData.Date = DateTime.Parse(xml.Title.B_start, null, DateTimeStyles.RoundtripKind);
                var temp = xml.Ch_details.Charges_d.Charge_d.Select(d =>
                    new { call = d.C_num, tot = d.C_tot }).ToArray();
 
                string[,] arrXml = new string[temp.Length, 2];
                for (int i = 0; i < arrXml.GetUpperBound(0); i++)
                {
                    arrXml[i, 0] = temp[i].call;
                    arrXml[i, 1] = temp[i].tot;
                }
                ExcelData.Excel = arrXml;
                return ExcelData;
            }).OrderBy(xml=>xml.Date).ToList();
            #endregion
 
 
            #region ToExcel
            var excalResult = excel.Result;
 
            for (int i = 4; i < xmlData.Count + 4; i++)
            {
                excalResult = Sorts(excalResult, xmlData[i - 4].Excel, i);
            }
 
            Excel.Application xlApp = new Excel.Application();
 
            Excel.Workbook xlWb;
            Excel.Worksheet xlSht;
            //var abs = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 
            xlWb = xlApp.Workbooks.Add(System.Reflection.Missing.Value);
            xlSht = (Excel.Worksheet)xlWb.Sheets[1];
 
            xlSht.Range["A1"]
                .Resize[excalResult.GetUpperBound(0), excalResult.GetUpperBound(1)]
                .Value = excalResult; 
            var excelDate = xmlData.Select(xml => xml.Date.ToString("MMM.yyyy")).ToArray();          
            xlSht.Range["D2"].Resize[1, excelDate.Length].Value = excelDate;
            xlSht.Columns["B:Z"].AutoFit();
 
            xlWb.Close(true);
            xlApp.Quit();
            #endregion
        });
        public static object[,] Sorts(object[,] arrExcel, string[,] arrXml, int n)
        {
            for (int i = 1; i <= arrExcel.GetLength(0); i++)
                for (int j = 0; j < arrXml.GetLength(0); j++)
                    if (arrExcel[i, 2]?.ToString().Trim() == arrXml[j, 0]?.Trim().Substring(2))
                    {
                        arrExcel[i, n] = arrXml[j, 1];
                    }
 
            return arrExcel;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5