Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Coroners
14 / 14 / 4
Регистрация: 18.07.2014
Сообщений: 65
1

Парсинг HTML без использования сторонних библиотек

06.11.2014, 15:54. Просмотров 704. Ответов 6
Метки нет (Все метки)

Доброго времени суток всем кто читает сеё сообщение %)
Прошу помочь кодом, советами, примером, мыслями и т.д. в распарсивании html файла только средствами С#. Всем заранее огромное спасибо.

Задача: необходимо без помощи сторонних библиотек используя возможности только c# распарсить Html файл находящийся на локальном диске (файл создаётся сторонней программой) и выяснить есть ли в данном файле среди ничем не примечательных таблиц одна определённая и если есть то из определённой ячейки забрать нужные данные.

Вводные данные: сторонняя программа формирует свои выходные данные в html формате при этом все данные идут в куче таблиц которые не имеют ни каких отличительных друг от друга признаков. Таблица как может существовать так и нет. Ниже приведена нужная нам таблица

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
....
<TABLE width="100%">
  <TBODY>
  <TR>
    <TD width="50%">Наименование ОППЗЛ</TD>
    <TD width="50%">МЕЧЕЛ-ФОНД ОППЗЛ</TD></TR>
  <TR>
    <TD width="100%" colSpan=2 align=middle>Системный номер документа 
      Заявление ответственного лица</TD></TR>
  <TR>
    <TD width="100%" colSpan=2 align=middle>052013 &nbsp; 20060011350 ( 044 ) 
      01</TD></TR>
  <TR>
    <TD width="50%">№ заявления 052T007-0000845</TD>
    <TD width="50%">от 26.10.2006</TD></TR></TBODY></TABLE>
...
При наличии такой таблицы необходимо забрать данные из:
HTML5
1
<TD width="50%">МЕЧЕЛ-ФОНД ОППЗЛ</TD></TR>
данные в этой строке всегда уникальные

Что сделано: пошёл в таком ключе (набросок)

C#
1
2
3
4
5
6
7
8
9
10
            using (OpenFileDialog ofdOpen = new OpenFileDialog() { Filter = "Хтмл|*.htm" })
            {
                if (ofdOpen.ShowDialog() != DialogResult.OK)
                    return;
                StreamReader myStreamReader = new StreamReader(ofdOpen.FileName, Encoding.Default);
                string html = myStreamReader.ReadToEnd();
                string Search = "Наименование ОППЗЛ"; // ищу по этой строке она определяет есть таблица или нет
                Match match = Regex.Match(html, Search);
                MessageBox.Show(match.Groups[0].ToString()); // тут соответственно пустота если нет таблицы или искомая строка если есть
            }
Вопрос с определение присутствует ли нужная нам таблица или нет вроде как решается сим способом однако как получить данные из следующей строки (другой ячейки таблицы) я понять не могу, не хватает знаний языка и опыта. (использовать другую среду разработки нельзя как и сторонние библиотеки, кроме того нельзя и грузить в веббраузер... получается что остаётся только как то регулярками мучать ((( )
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2014, 15:54
Ответы с готовыми решениями:

Рисование 3D фигур без использования сторонних библиотек
в последнее время стало интересно как рисовать математически 3D фигуры в c# при этом не используя...

архивирование кталога без использования сторонних библиотек
может кто сталкивался...кодом поделится;)

Чтение ID3v2 в MP3 тегов без использования сторонних библиотек
Здравствуйте господа. Я столкнулся с проблемой при чтении ID3v2 тегов: в случае использования...

Как реализовать на C# алгоритм blockchain без использования сторонних библиотек?
Добрый день! Хочу реализовать алгоритм blockchain в своём приложении (не для денежных операций)....

Просмотр видео с камеры подключенной к серверу без сторонних библиотек
Привет! Есть ли возможность создать приложение, которое позволит просмотр видео с камеры...

6
Nikeys174
27 / 55 / 19
Регистрация: 18.08.2014
Сообщений: 329
Завершенные тесты: 1
06.11.2014, 16:18 2
Весь html принимается как текст. и шаблоном регулярных выражений находим нужную. И забираем нужные данные.
как нашел регуляркой шаблон, ищи через IndexOf ближайщий закрывающий тег таблицы. Затем обычным substring-ом выцепляй
1
Coroners
14 / 14 / 4
Регистрация: 18.07.2014
Сообщений: 65
06.11.2014, 19:00  [ТС] 3
Nikeys174, спасибо за совет, что то я перетрухнул и совсем забыл за IndexOf и не смотрел в сею сторону, а действительно при моей задаче получается всё достаточно просто.
Набросок на коленке (достаточно кривой но идею задумки выражает)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                StreamReader myStreamReader = new StreamReader(ofdOpen.FileName, Encoding.Default);
                string html = myStreamReader.ReadToEnd(); // весь хтмл в текст
                string Search = "Наименование ОППЗЛ"; //чего ищем в моём случае наличие таблицы
                if (html.IndexOf(Search) != -1) // как бы определили что таблица есть
                {
                    int q = html.IndexOf(Search); //ну тут как бы запомнили положение
                    int w = html.IndexOf("<TD width=\"50%\">",q); //находим следующий столбец таблицы от q
                    int z = html.IndexOf(">", w)+1; //находим от w первый тег > и смещаем индекс на 1
                    int m = html.IndexOf("</TD></TR>",z);//находим от z конец столбца - между z и m получается и находятся нужные мне данные
                    string r = html.Substring(z, m-z); //забираем данные
                    MessageBox.Show(r);
                }
                else
                {
                    MessageBox.Show("нет нужной таблицы");
                }
по идее должно работать %), за код не пинайте просто просто демонстрация на коленке которая по идее должна работать (приду домой проверю сею мысль). Nikeys174, ещё раз спасибо. Если у кого будут более выгодные варианты тема всё ещё актуальная.
0
Nikeys174
27 / 55 / 19
Регистрация: 18.08.2014
Сообщений: 329
Завершенные тесты: 1
06.11.2014, 19:48 4
переменные z и w думаю лишние. в q найди начало таблицы точнее место расположения. а в m найди конец - таблицы. Благо они завершаются одним тегом, код работает если нет таблицы в таблице
0
Coroners
14 / 14 / 4
Регистрация: 18.07.2014
Сообщений: 65
07.11.2014, 02:32  [ТС] 5
Nikeys174, дело в том что мне не нужна вся таблица целиком, а нужна всего одна строчка со значением из неё если она существует, о чём я и писал.
0
Nikeys174
27 / 55 / 19
Регистрация: 18.08.2014
Сообщений: 329
Завершенные тесты: 1
07.11.2014, 07:59 6
еще вариант, если в каждой нужной твоей таблице встречается «ОППЛЗ», то можно написать через регулярные выражения поиск таких таблиц, а дальше разбирать, как писалось выше.
0
Archy87
4 / 4 / 1
Регистрация: 09.06.2014
Сообщений: 26
07.11.2014, 11:40 7
C#
1
2
3
4
5
6
using System.Text.RegularExpressions;
 
string text = "твой html";
string result = "";
foreach(Match Tag in Regex.Matches(text, @"<TD width=""\d+\%"">(?<text>.*?)</TD>"))
        result += Tag.Groups["text"].Value + "\r\n";
1
07.11.2014, 11:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2014, 11:40

Проверить какие пакеты отсылает программа без использования сторонних снифферов
К примеру у меня httpwebrequest послылает запрос. и мне нужно в этой же программе его поймать и...

Подключение сторонних библиотек к проекту на Silverlight
Вопрос такой. Я делаю проект-библиотеку Lib1.dll. В этом проекте подключены сторонние библиотеки...

Получение HTML веб-страницы без использования WebRequest/WebClient
Доброго времени суток. Короткая преамбула: имеется онлайн каталог одной японской...


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

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

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