Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 20.02.2010
Сообщений: 17

Подскажите по парсеру html и регулярным выражением

24.03.2016, 13:22. Показов 1978. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята, нужна помощь. Впервые пишу парсер и тем более на C#. До этого изучал с++ в институте, а сейчас возникла такая необходимость все это вспомнить. В общем, нашел мануал на ютубе и вот пытаюсь. Задача такова: нужно спарсить список игр из профиля steam. Хранится информация в следующем виде


Есть вот такой код, который не работает. Прошу помощи в указании ошибок, и если не трудно, напишите регулярное выражение для парса нужной мне информации, желательно с пояснениями, чтобы разобраться что к чему

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Net;
using System.Threading.Tasks;
 
 
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
 
            //regular
            //<div class="gameListRowItem"> <div class="gameListRowItemName ellipsis ">Dota 2</div> <h5 class="ellipsis">304 ч. всего</h5> </div>
 
            WebClient w = new WebClient();
            string page = w.DownloadString("http://steamcommunity.com/id/стим_айди/games/?tab=all");
            string name = "<div class="gameListRowItemName">(.*?)</div>";
            foreach (Match match in Regex.Matches(page, name))
                listBox1.Items.Add(match.Groups[1].Value);
        }
 
       
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.03.2016, 13:22
Ответы с готовыми решениями:

Захват регулярным выражением нескольких значений в html файле
Здравствуйте форумчане. Как захватить несколько значений в html файле вида: &lt;a href=&quot;/link123_123?arg1=value&quot;...

Регулярным выражением очистить ширину и высоту ячейки таблицы HTML
Что необходимо в теме поста написано, результатом регулярки столбец справа: &lt;td height=&quot;122&quot;&gt; &lt;td&gt; &lt;td...

Каким регулярным выражением можно разбить html текст в массив по тегам?
Есть, к примеру, такой код: &lt;img src=&quot;image.jpg&quot; /&gt;&lt;p&gt;Об этом впервые заговорили в конце 1950-х годов.&lt;/p&gt; &lt;span&gt;роль...

20
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
24.03.2016, 15:09
Seregatlt, когда пишешь регулярку прямо в коде, надо учитывать, что это все-таки строковый литерал и кавычки в регулярке надо экранировать, иначе в коде "<div class=" вторая кавычка воспринимается как закрывающая литерал, что приводит к синтаксической ошибке.

Ну и кроме того, для разбора HTML лучше использовать Html Agility Pack - Home, а не регулярки.
0
0 / 0 / 0
Регистрация: 20.02.2010
Сообщений: 17
24.03.2016, 15:59  [ТС]
diadiavova у меня там было экранировано обратным / перед ковычками, просто когда сюда код вставляешь - оно убирается почему-то
А про Agility Pack почитаю, спасибо
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
24.03.2016, 16:28
Seregatlt, а ты пробовал скачивать страницу вебклиентом и смотреть код? Там есть те элементы, которые ты ищешь? Ведь если на странице требуется авторизация, то надо куки отправлять.
0
0 / 0 / 0
Регистрация: 20.02.2010
Сообщений: 17
24.03.2016, 18:03  [ТС]
diadiavova, скачивал, все элементы на месте, без авторизации страничка тоже открывается и все отображается
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
24.03.2016, 18:10
Seregatlt, ну вот у меня нет образца страницы, но вот такой код
C#
1
2
3
4
            string page = "фдваоафывдао<div class=\"gameListRowItemName\">Имя1</div>авыпаы<div class=\"gameListRowItemName\">Имя2</div>ыпывапы";
            string name = "<div class=\"gameListRowItemName\">(.*?)</div>";
            foreach (Match match in Regex.Matches(page, name))
                Console.WriteLine(match.Groups[1].Value);
все правильно выводит. Ссылка, как я понимаю, какая-то секретная, так что не знаю, чем еще могу помочь.
1
0 / 0 / 0
Регистрация: 20.02.2010
Сообщений: 17
24.03.2016, 20:36  [ТС]
Не секретная, просто там любой профиль может быть. Попробуйте вот с такой ссылкой, получится или все же дело в странице? http://steamcommunity.com/id/n... s/?tab=all
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
24.03.2016, 20:45
Цитата Сообщение от Seregatlt Посмотреть сообщение
Попробуйте вот с такой ссылкой,
По этой ссылке открылась страница с пустым списком. Поиск строки <div class="gameListRowItemName"> в исходном коде средствами браузера ничего не дал. Естественно программа тоже ничего не нашла
1
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
24.03.2016, 20:49
Вот скриншот сделал
Миниатюры
Подскажите по парсеру html и регулярным выражением  
1
0 / 0 / 0
Регистрация: 20.02.2010
Сообщений: 17
24.03.2016, 21:06  [ТС]
Все ясно, странно, а у меня в браузере все нормально открывается и это не мой профиль. Ясно теперь почему не работает. А что вы там говорили про авторизацию и куки? Подскажете как можно тогда это реализовать?

PS: с текстом все работает у меня, проверил ваш метод Спасибо за тест моего кода
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
24.03.2016, 21:36
Насчет скриншота - поторопился, у меня там NoScript блокировал один скрипт, который, видимо и формирует список. Если это так, то естественно на странице просто скачанной с сервера этих данных не будет. В этом и разгадка. Если надо получить данные, просто просмотри, что отправляется на сревер и с какого адреса приходят нужные данные.

Добавлено через 1 минуту
Цитата Сообщение от Seregatlt Посмотреть сообщение
проверил ваш метод
Это не мой метод, я код у тебя взял )))

Добавлено через 28 минут
Короче дело обстоит следующим образом. В документе есть ссылка на скрипт со следующим адресом
http://steamcommunity-a.akamai... &l=russian. Вот в нем весь код и содержится. Но в немного неудобоваримом виде. В частности вот фрагмент
JavaScript
1
<div class=\"gameListRowItemName ellipsis #{text_color}\">#{name_escaped}<\/div>
Содержимое может показаться странным и, возомжно, это не то, что ты искал, но такой формат обычно используется некоторыми фреймворками, поддерживающими текстовые шаблоны. Это, скорей всего шаблон, который вставляется в код, после чего это дело обрабатывается и из него генерируется список. То есть без выполнения JavaScript, тут очень сложно будет выковыривать информацию из кода. Можно загружать все в WebBrowser и тянуть оттуда готовые данные. Это несложно.
0
0 / 0 / 0
Регистрация: 20.02.2010
Сообщений: 17
24.03.2016, 21:40  [ТС]
Пошел читать про WebBrowser
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
24.03.2016, 21:55
Ага, я тоже нашел. Все оказалось намного проще. ))
Цитата Сообщение от Seregatlt Посмотреть сообщение
но как его запарсить, так и не придумал
Да там и придумывать не надо, там данные представлены в формате JSON. Как работать с этим форматом можно прочитать здесь
Как сериализовать и десериализовать данные JSON. Регулярка тоже довольно простая
C#
1
string name = "var rgGames = (.*?);";
Так же вытащишь первую группу и у тебя будет JSON, который надо десериализовать. Но придется для этого классы создать для десериализации, как описано по ссылке.
0
0 / 0 / 0
Регистрация: 20.02.2010
Сообщений: 17
24.03.2016, 22:04  [ТС]
Я тут пока решил JSON не трогать, потому что не понял ничего про сериализацию и прочее. Хотел попробовать webBrowser. Но если страницу загружать в него, происходит ошибка скрипта java и в итоге список игр опять не прогружается. Видимо придется в JSON вникать
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
24.03.2016, 22:08
Кстати в студии есть инструменты для работы с JSON, файл с таким расширением откроешь, он будет подсвечен, его можно отформатировать. Кроме того, классы можно сформировать тоже автоматически, для этого надо скопировать код JSON и в файл с кодом вставить, но надо использовать меню Правка-Специальная вставка-Вставить JSON как классы. В твоем случае получается вот такая структура
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
public class Rootobject
{
    public Class1[] Property1 { get; set; }
}
 
public class Class1
{
    public int appid { get; set; }
    public string name { get; set; }
    public string logo { get; set; }
    public Availstatlinks availStatLinks { get; set; }
    public object friendlyURL { get; set; }
    public string hours_forever { get; set; }
    public int last_played { get; set; }
    public string friendly_name { get; set; }
    public string hours { get; set; }
    public int has_adult_content { get; set; }
}
 
public class Availstatlinks
{
    public bool achievements { get; set; }
    public bool global_achievements { get; set; }
    public bool stats { get; set; }
    public bool leaderboards { get; set; }
    public bool global_leaderboards { get; set; }
}
Возможно придется атрибуты проставить только
0
0 / 0 / 0
Регистрация: 20.02.2010
Сообщений: 17
25.03.2016, 08:59  [ТС]
diadiavova, если позволите, снова помучаю вас вопросами.

1) Обязательно ли описывать всю структуру JSON или я могу указать только
C#
1
2
3
   public int appid { get; set; }
    public string name { get; set; }
    public string logo { get; set; }
если мне другие параметры не нужны?

2) Я тут нашел один замечательный пример (http://котодомик.рф/json_csharp/), для теста пытаюсь его проделать, но получаю ошибку "Не допустимая лексема = в объявлении класса, структуры или интерфейса"
C#
1
2
3
4
5
6
7
8
9
10
        MyGames myCollection = new MyGames();
            myCollection.Games = new Game[1];
 
            myCollection.Games[0] = new Game()
            {
                Artist="Artist1",
                Album="Album1",
                Title="Title1",
                Year="2015"
            };
3) Не подскажете, как вместо пункта 2, мне передать в программу данные с той страницы, что мне необходима http://steamcommunity-a.akamai... &l=russian ?

Добавлено через 9 минут
Пункт 2 снимается с вопроса, я понял свой косяк
0
0 / 0 / 0
Регистрация: 20.02.2010
Сообщений: 17
25.03.2016, 09:22  [ТС]
Вот такой вариант у меня получился по мануалу, но выдает ошибку (вложение)

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
82
83
84
85
86
87
88
89
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Net;
using System.Windows.Forms;
using System.Threading.Tasks;
using Newtonsoft.Json;
 
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        class MyMusic
        {
            public Track[] Tracks { get; set; }
        }
 
        class Track
        {
            public string Artist { get; set; }
            public string Album { get; set; }
            public string Title { get; set; }
            public string Year { get; set; }
 
        }
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            MyMusic myCollection = new MyMusic();
            myCollection.Tracks = new Track[3];
 
            myCollection.Tracks[0] = new Track()
            {
                Artist = "Artist1",
                Album = "Album1",
                Title = "Title1",
                Year = "2015"
            };
            myCollection.Tracks[1] = new Track()
            {
                Artist = "Artist2",
                Album = "Album2",
                Title = "Title2",
                Year = "2015"
            };
            myCollection.Tracks[2] = new Track()
            {
                Artist = "Artist3",
                Album = "Album3",
                Title = "Title3",
                Year = "2015"
            };
 
            string serialized = JsonConvert.SerializeObject(myCollection);
            richTextBox1.Text = serialized;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            string json = richTextBox1.Text;
            try
            {
                MyMusic newMusic = JsonConvert.DeserializeObject<MyMusic>(json);
                richTextBox1.Text = "Всего треков добавлено: " + newMusic.Tracks.Length + Environment.NewLine;
                foreach (var track in newMusic.Tracks)
                {
                    richTextBox1.Text += track.Artist + " (" + track.Album + "-" + track.Year + ") - " + track.Title + Environment.NewLine;
                }
            }
            catch (Exception ex)
            {
                richTextBox1.Text = "К сожалению произошла ошибка." + Environment.NewLine + ex.Message + Environment.NewLine;
                richTextBox1.Text += "Скорее всего вы не ввели JSON-строку. Если вы не можете понять причину ошибки - спросите на сайте котодомик.рф =)" + Environment.NewLine;
            }
 
        }
    }
}
Потом буду под свою задачу переделывать
Миниатюры
Подскажите по парсеру html и регулярным выражением  
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
25.03.2016, 10:46
Лучший ответ Сообщение было отмечено Seregatlt как решение

Решение

Я тебе пример набросал с твоей страничкой. Думаю - разберешься.
Вложения
Тип файла: rar RegexExtractHtmlData.rar (39.5 Кб, 4 просмотров)
1
0 / 0 / 0
Регистрация: 20.02.2010
Сообщений: 17
25.03.2016, 13:12  [ТС]
Спасибо, вечером посмотрю, что-то мой 2010 express c# не хочет открывать. Дома новую студию поставлю и посмотрю
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
25.03.2016, 13:16
Цитата Сообщение от Seregatlt Посмотреть сообщение
Дома новую студию поставлю и посмотрю
Просто создай консольное приложение, скопируй код туда и добавь в проект ссылку на сборку System.Runtime.Serialization. Должно заработать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.03.2016, 13:16
Помогаю со студенческими работами здесь

с регулярным выражением.
Имеем текст youtube.com/watch?v=LOZuxwVk7TU&amp;ob=av2em нужно получить то что находится между /watch?v= и &amp; в нашем случае...

Сложности с регулярным выражением
Доброго времени суток. Разобрался я с регулярками, но идей как решить следующую проблему не приходит. Есть такой текст: Рузалина...

Помогите с регулярным выражением
Доброго времяни суток! Помогите написать регулярное выражение, ищу определённый текст на сайте. текст примерно такого типа &lt;a...

Запутался с регулярным выражением
Смотрел SED'овский туториал и не могу понять последний пример. Что-то вообще слабо укладывается процесс нахождения шаблона. Кому не сложно,...

ФИО регулярным выражением
Добрый день! Нужно сделать программу которая бы используя ТОЛЬКО регулярные выражения выводила бы ФИО, после ввода пользователя. ФИО -...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru