Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/12: Рейтинг темы: голосов - 12, средняя оценка - 4.83
си-шарп
1 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 27
1

Парсинг страницы

03.03.2014, 21:20. Просмотров 2322. Ответов 10
Метки нет (Все метки)

Доброго времени суток.

Крайне необходимо парсить страницу
http://www.stoloto.ru/keno/archive

Результаты за 6 месяцев

Страница через чур тяжёлая, HTML только около 5 мегабайт.

Методом "тыка" терпения не хватает что-то делать, инет крайне слабо работает.

Скачал и подключил HtmlAgilityPack, но вообще затрудняюсь, нет опыта с парсингом.


Подскажите как этот код подогнать под эти цели


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using HtmlAgilityPack;
using HtmlDocument = HtmlAgilityPack.HtmlDocument;
 
namespace parser_keno
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        string html = string.Empty;
        string outputText = "";
       
        private void button1_Click(object sender, EventArgs e)
        {
            string htmll = "http://www.stoloto.ru/keno/archive";
            HtmlDocument HD = new HtmlDocument();
            var web = new HtmlWeb
        {
            AutoDetectEncoding = false,
            OverrideEncoding = Encoding.UTF8,
        };
            HD = web.Load(htmll);
 
            // Собственно, здесь и производится выборка интересующих нодов
            // В данном случае выбираем блочные элементы с классом eTitle
            HtmlNodeCollection NoAltElements = HD.DocumentNode.SelectNodes("здесь пробовал по разному запросить");
 
            // проверка на наличие найденных узлов
            if (NoAltElements != null)
            {
                foreach (HtmlNode HN in NoAltElements)
                {
                    //Получаем строчки
                     outputText = HN.InnerText;
                }
            }
            richTextBox1.Text = outputText.ToString();
        }
    }
}
пример из интернета....ошибки, что-то не правильно?

ссылку на библиотеку подключил HtmlAgilityPack. А эта библиотека может находиться где угодно, или нужно кидать её в папку visual studio?!

нужны данные со страница в таком виде

23569 03.03.2014 03 04 09 11 15 22 34 35 39 53 57 59 62 70 73 75 76 78 79 (текстовый)

или на крайний случай такие

03 04 09 11 15 22 34 35 39 53 57 59 62 70 73 75 76 78 79


Посмотрите опытным взглядом кто понимает, и направьте на путь истинный)
Помогите подогнать код, если не трудно....
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2014, 21:20
Ответы с готовыми решениями:

Парсинг страницы
Есть такая страница: http://chnpp.gov.ua/ru/home Из нее нужно вытащить...

Парсинг страницы
Доброго времени суток Пытаюсь парсить страницу регулярными варыжениями ...

Парсинг страницы
При парсинге страницы выдаёт : Для просмотра этой страницы необходима поддержка...

Парсинг xml страницы
Всем доброго времени. Есть xml страница откуда нужно получить ноду из тега...

Парсинг HTML страницы
вот есть текст <div class="w300 left"> <span...

10
Lexeq
03.03.2014, 23:01
  #2

Не по теме:

Цитата Сообщение от си-шарп Посмотреть сообщение
Страница через чур тяжёлая
чересчур

1
си-шарп
1 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 27
04.03.2014, 08:31  [ТС] 3
Вы бы лучше подсказали по коду)
А синтаксис русского языка сейчас меня меньше всего интересует)

Добавлено через 32 минуты
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<a href="/keno/archive/23498">23498</a>
                        <span class="alt_links"> / <ins class="pseudo">26.01.2014, 21:00</ins></span>
                    </div>
                    <div class="numbers  ">
                        <div class="container">
                                                            <b>03&nbsp;</b>
                                                            <b>08&nbsp;</b>
                                                            <b>13&nbsp;</b>
                                                            <b>18&nbsp;</b>
                                                            <b>26&nbsp;</b>
                                                            <b>27&nbsp;</b>
                                                            <b>35&nbsp;</b>
                                                            <b>40&nbsp;</b>
                                                            <b>41&nbsp;</b>
                                                            <b>42&nbsp;</b>
                                                            <b>44&nbsp;</b>
                                                            <b>51&nbsp;</b>
                                                            <b>56&nbsp;</b>
                                                            <b>57&nbsp;</b>
                                                            <b>63&nbsp;</b>
                                                            <b>65&nbsp;</b>
                                                            <b>68&nbsp;</b>
                                                            <b>76&nbsp;</b>
                                                            <b>78&nbsp;</b>
                                                            <b>80&nbsp;</b>
                                                                                </div>
                    </div>


вот фрагмент который нужно парсить

Добавлено через 13 минут
или просто кто составьте регулярку, чтобы подставить в этот код
C#
1
2
3
4
5
6
7
8
string[] strr = { "dhtir\":\"","\",\"cplm"};//здесь нужна регулярка
            string[] data =  File.ReadAllText("data.txt").Split(strr, StringSplitOptions.RemoveEmptyEntries)
                  .Where(q => q.Contains("numeros")).ToArray();// и здесь не знаю что писать
 
            foreach (string sr in data)
            {
                Console.WriteLine(sr);
            }
0
Wolfdp
805 / 759 / 193
Регистрация: 15.06.2012
Сообщений: 2,960
Записей в блоге: 1
Завершенные тесты: 1
04.03.2014, 14:09 4
Цитата Сообщение от си-шарп Посмотреть сообщение
File.ReadAllText("data.txt")
5Мб в память, а фили нам, у нас же 4Гб ОЗУ как минимум. Хватить и сплитить, и ещё кучу массивов создать.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
 
namespace TestParsing
{
    class Program
    {
        static void Main(string[] args)
        {
            var url = "http://www.stoloto.ru/keno/archive";
            var temporyFile = @"D:\nya\temp\asdf.txt";
            var client = new WebClient();
            using (var reader = client.OpenRead(url))
            {
                Console.WriteLine("Start download html page");
                using (var writer = new FileStream(temporyFile, FileMode.Create))
                    reader.CopyTo(writer);
            }
            Console.WriteLine("Download html page is complite.");
 
            var mark = "<div class=\"container\">";
            string line = string.Empty;
            int length = 20;
            var result = new List<byte[]>();
            Console.WriteLine("Start parsing html page");
            var count = 0;
            using(var reader = new StreamReader(temporyFile))
            {
                while ((line = reader.ReadLine()) != null)
                {
                    count++;
                    if (line.Contains(mark))
                    {
                        var array = new byte[length];
                        result.Add(array);
                        for (int i = 0; i < length; i++)
                        {
                            if(string.IsNullOrEmpty(line = reader.ReadLine()))
                                throw new Exception();
                            array[i] = Convert.ToByte(line.Replace(" ", string.Empty).Replace("<b>", string.Empty).Replace("&nbsp;</b>", string.Empty).Replace("\t", string.Empty));
                        }
                    }
                }
            }
            Console.WriteLine("count line = {0}", count);
            Console.WriteLine("all = {0}", result.Count);
            for (int i = 0; i < result.Count && i < 5; i++)
            {
                foreach (var item in result[i])
                {
                    Console.Write("{0} ", item);
                }
                Console.WriteLine();
            }
 
            File.Delete(temporyFile);
            Console.WriteLine("Nya!");
            Console.ReadKey();
        }
    }
}
1
си-шарп
1 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 27
04.03.2014, 14:19  [ТС] 5
Wolfdp, спасибо буду пробовать!

про размер страницы,... я имел ввиду другое.
0
MrCold
861 / 759 / 174
Регистрация: 11.01.2012
Сообщений: 1,942
04.03.2014, 14:52 6
Страница простая, легко парсится.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
namespace CSWebParse
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.Enabled = false;
            string url = "http://www.stoloto.ru/keno/archive";
           
            try
            {
                WebClient client = new WebClient();
                client.Encoding = System.Text.Encoding.UTF8;
                client.DownloadStringCompleted += (sender, e) =>
                {
                    if (!e.Cancelled && e.Error == null)
                    {
                        result = e.Result;
                        button1.Enabled = true;
                    }
                };                
                client.DownloadStringAsync(new Uri(url));
                
            }
            catch (WebException ex)
            {
 
                richTextBox1.Text = ex.Message;
            }
         
            catch (Exception ex)
            {
 
                richTextBox1.Text = ex.Message;
            }
           
        }
        string result = string.Empty;
    
        private void button1_Click(object sender, EventArgs e)
        {
            richTextBox1.Clear();
            var doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(result);
            var monthList = doc.DocumentNode.SelectNodes("//div[@class='month']");  
         
            foreach (var month in monthList)              
            {
                var elemList = month.ChildNodes.Where(x => x.Name == "div" && x.Attributes["class"].Value == "elem");
                foreach (var elem in elemList)
                {
                     var indoc = new HtmlAgilityPack.HtmlDocument();
                         indoc.LoadHtml(elem.InnerHtml);
                         HtmlAgilityPack.HtmlNode a = indoc.DocumentNode.SelectSingleNode("//a");
                         HtmlAgilityPack.HtmlNode ins = indoc.DocumentNode.SelectSingleNode("//ins");
 
                   if( a != null && ins != null)
                       richTextBox1.AppendText(String.Format("{0}   {1}   ", a.InnerText, ins.InnerText));
 
                   var numberList = indoc.DocumentNode.SelectNodes("//b");
                   StringBuilder sb = new StringBuilder(256);
                   foreach (var num in numberList)
                   {
                       sb.Append(num.InnerText.Replace("&nbsp;", " "));
                   }
                   richTextBox1.AppendText(sb.ToString() + Environment.NewLine);
                }                   
           }    
        }        
    }
}
1
Миниатюры
Парсинг страницы  
си-шарп
1 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 27
04.03.2014, 16:35  [ТС] 7
Ребята большое спасибо!
Примеры отличные, они много для меня проясняют.

Добавлено через 12 минут
Подскажите, а можно ли индикатор процесса поставить ещё, для индикации загрузки полной?
Что бы не создавалось впечатление что парсер завис (если скорость инета совсем слабая)

Добавлено через 1 час 16 минут
MrCold, пример хорошо работает

на выходе такая строка
23284 04.09.2013, 23:59 02 08 13 19 22 26 30 32 39 42 45 59 61 65 68 69 70 71 73 76

можете подправить чтобы была такая
23284 04.09.2013 02 08 13 19 22 26 30 32 39 42 45 59 61 65 68 69 70 71 73 76

один пробел
время убрать
запятую убрать
и в конце строки пробел убрать

это для того чтобы текстовый файл сразу зашёл в программу для обработки

конечно я бы сам как нибудь сделал )

страница у меня грузится около 10 минут, ... так можно подгонять пример месяц-полтора))
0
MrCold
861 / 759 / 174
Регистрация: 11.01.2012
Сообщений: 1,942
04.03.2014, 18:32 8
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
if( a != null && ins != null)
    {
        string date = string.Empty;
        int pos = 0;
        if ((pos = ins.InnerText.IndexOf(',')) != -1)
            date = ins.InnerText.Remove(pos);
        richTextBox1.AppendText(String.Format("{0} {1} ",a.InnerText, date ));
    }
    var numberList = indoc.DocumentNode.SelectNodes("//b");
    StringBuilder sb = new StringBuilder(256);
    foreach (var num in numberList)
    {
        sb.Append(num.InnerText.Replace("&nbsp;", " "));
    }
    richTextBox1.AppendText(sb.ToString().TrimEnd() + Environment.NewLine);
1
си-шарп
1 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 27
04.03.2014, 19:00  [ТС] 9
MrCold, всё работает.

буду теперь вникать и пробовать парсить сам другие страницы.

Последний вопрос, можно индикатор процесса встроить
например
progressBar?
0
MrCold
861 / 759 / 174
Регистрация: 11.01.2012
Сообщений: 1,942
04.03.2014, 19:06 10
Ну конечно можно .Этот вопрос уже ни один раз решался .
Советую отдельную тему создать .А в начале просто поискать
темы "Индикатор загрузки"
0
си-шарп
1 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 27
04.03.2014, 19:57  [ТС] 11
Индикатор я могу встраивать в циклы к примеру.
А здесь ведь нужно узнать сначала размер загружаемой страницы. Затем следить как-то процесс, и делать индикацию, в зависимости от того сколько загружено...

В элементе WebBrowser я это делал...там есть события
А здесь я не знаю, ...ну если можно то буду искать

Добавлено через 38 минут
в общем так добавил
C#
1
2
3
4
5
6
7
8
9
client.DownloadProgressChanged += new System.Net.DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
 
 
 private void client_DownloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e)
        {
            progressBar1.Maximum = 100;
            progressBar1.Value = e.ProgressPercentage;
            this.Text = e.ProgressPercentage.ToString();
        }
0
04.03.2014, 19:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2014, 19:57

Парсинг страницы. NullReferenceException
Здравствуйте. Написал код для парсинга интернет страницы private int...

Парсинг страницы (сломался)
Доброго времени суток! Нужна помощь. История такова, парсер работал около...

Парсинг страницы html
Здравствуйте. Помогите отпарсить нужные данные со страницы загруженную в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru