powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Парсер
25 сообщений из 163, страница 1 из 7
Парсер
    #38357074
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Знаю что уже много обсуждали данный вопрос но только он у меня несколько необычный но очень простой. Библиотеки парсеры не использую так как функционал простой тем не менее появилась проблема которую пока даже не знаю как решить.


И так есть html таблица шапка и одна строка (более строк не бывает)

Код: html
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.
<table>
<tr>
<td>
ФИО
</td>
<td>
ТЕЛЕФОН
</td>
<td>
Идентификационный код
</td>
<td>
Прочая инфа
</td>
</tr>

<tr>
<td>
Пупкин
</td>
<td>
06711111111
</td>
<td></td>
<td>
Примечание
</td>
</tr>
</table>



ИНН я не указывал так как есть не обязательные поля

так вот в программе я это разбираю так

Код: c#
1.
2.
3.
4.
5.
6.
//....чтение инфы и т д.
string[] values = strResult.Split(new string[] { "<tbody>", "</tbody>" }, StringSplitOptions.RemoveEmptyEntries);
string[] tr = values[1].Split(new string[] { "<tr>", "</tr>" }, StringSplitOptions.RemoveEmptyEntries);

string[] head = tr[0].Split(new string[] { "<td>", "</td>" }, StringSplitOptions.RemoveEmptyEntries);
string[] data = tr[1].Split(new string[] { "<td>", "</td>" }, StringSplitOptions.RemoveEmptyEntries);



//построив два массива далее я успешно их обрабатывал но появилась еще одна "контора" которая тоже присылает html файл он 1:1 как и другие кроме одного все идет сплошным текстом

Код: html
1.
<table><tr><td>ФИО</td><td>ТЕЛЕФОН</td><td>Идентификационный код</td><td>Прочая инфа</td></tr><tr><td>Пупкин</td><td>06711111111</td><td></td><td>Примечание</td></tr></table>



И вот если между тегами нет текста (<td></td>) то в переменную data не добавляется ничего и длинна массива head становится больше чем data

Как должно быть

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
head[0] = "ФИО";
head[1] = "ТЕЛЕФОН";
head[2] = "Идентификационный код";
head[3] = "Прочая инфа";

data[0] =  "Пупкин";
data[1] =  "06711111111";
data[2] =  "";
data[3] =  "Примечание";



как есть сейчас

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
head[0] = "ФИО";
head[1] = "ТЕЛЕФОН";
head[2] = "Идентификационный код";
head[3] = "Прочая инфа";

data[0] =  "Пупкин";
data[1] =  "06711111111";
data[2] =  "Примечание";



data[2] = ""; - хоть оно и пустое но оно должно быть

Подскажите как это можна решить, что бы индексы строк массива data из-за этого не "съезжали" ?

Спасибо.
...
Рейтинг: 0 / 0
Парсер
    #38357269
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIT2708Подскажите как это можна решить, что бы индексы строк массива data из-за этого не "съезжали" ?Вообще не писать подобный говнокод будет лучшим решением.

Это же фактически xml. Если в ячейках нет невалидных html-тегов типа <br>, то работать с этим текстом надо как с xml.
...
Рейтинг: 0 / 0
Парсер
    #38357313
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

вообще то теги <br> есть я их здесь не приводил так как это не критично
...
Рейтинг: 0 / 0
Парсер
    #38357343
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возьми HtmlAgilityPack
...
Рейтинг: 0 / 0
Парсер
    #38357416
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIT2708, с помощью регулярок можно:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
string text = "<table>...</table>";
Regex re = new Regex(@"<td>\s*(?<FIO>[^>]*?)\s*</td>\s*<td>\s*(?<Phone>[^>]*?)\s*</td>\s*<td>\s*(?<INN>[^>]*?)\s*</td>\s*<td>\s*(?<Remark>[^>]*?)\s*</td>\s*</tr>\s*</table>", RegexOptions.Multiline);
Match m  = re.Match(text.Replace("<br>", ""));
if (m.Success)
{
	string fio = m.Groups["FIO"].Value;
	string phone = m.Groups["Phone"].Value);
	string inn = m.Groups["ШТТ"].Value;
	string remark = m.Groups["Remark"].Value;
}



Если кроме данных требуются имена колонок, то делаем так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
Regex re = new Regex(@"<table>\s*<tr>(?:\s*<td>(?<HEAD>[^>]*?)</td>\s*)+</tr>\s*<tr>(?:\s*<td>(?<DATA>[^>]*?)</td>\s*)+</tr>\s*</table>", RegexOptions.Multiline);
Match m  = re.Match(text.Replace("<br>", ""));
if (m.Success)
{
	string[] head = match.Groups["HEAD"].Captures.Cast<Capture>().Select(c => c.Value.Trim()).ToArray();
	string[] data = match.Groups["DATA"].Captures.Cast<Capture>().Select(c => c.Value.Trim()).ToArray();
}
...
Рейтинг: 0 / 0
Парсер
    #38357436
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,


...
Рейтинг: 0 / 0
Парсер
    #38357448
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Парсер
    #38357565
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нахлобуч, побереги глаза :)

Оба регулярных выражения состоят из повторяющихся частей так что их несложно понять. При желании можно "дать подсказку" с помощью форматирования:
Код: c#
1.
2.
3.
4.
5.
6.
Regex re = new Regex(@"<td>\s*(?<FIO>[^>]*?)\s*</td>\s*"+
                     @"<td>\s*(?<Phone>[^>]*?)\s*</td>\s*"+
                     @"<td>\s*(?<INN>[^>]*?)\s*</td>\s*"+
                     @"<td>\s*(?<Remark>[^>]*?)\s*</td>\s*"+
                     @"</tr>\s*</table>"
                     , RegexOptions.Multiline);
...
Рейтинг: 0 / 0
Парсер
    #38357664
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Парсер
    #38357744
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фигней не майтесь, возьми HtmlAgilityPack там уже давно все украдено придумано до нас!
...
Рейтинг: 0 / 0
Парсер
    #38357771
Ermak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЗа парсинг html/xml с помощью регвыров - убивать

ух как грозно и категорично.

Так уж сложилось, что для парсинга html использую RegExp'ы и особых проблем не испытываю.
HtmlAgilityPack смотрел, пробовал, но предпочтение отдаю RegExp, просто мне так удобнее.
...
Рейтинг: 0 / 0
Парсер
    #38357778
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ermakдля парсинга html использую RegExp'ы и особых проблем пока не испытываю
Поправил :)
...
Рейтинг: 0 / 0
Парсер
    #38357826
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныЗа парсинг html/xml с помощью регвыров - убивать.
Категоричность сестра догматизма. Регулярные выражения это инструмент со своими плюсами и минусами. В общем случае я бы не стал применять регулярки для разбора html, но в данном конкретном случае считаю их применение оправданным из-за простой структуры документа. Если он усложнится - например, добавятся атрибуты у тегов - , то тогда следует переключиться на HtmlAgilityPack.

В заметке Jeff Atwood об этом тоже сказано:
http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html So, while I may attempt to parse HTML using regular expressions in certain situations , I go in knowing that:

- It's generally a bad idea.
- Unless you have discipline and put very strict conditions on what you're doing , matching HTML with regular expressions rapidly devolves into madness, just how Cthulhu likes it.
- I had what I thought to be good, rational, (semi) defensible reasons for choosing regular expressions in this specific scenario .

It's considered good form to demand that regular expressions be considered verboten, totally off limits for processing HTML, but I think that's just as wrongheaded as demanding every trivial HTML processing task be handled by a full-blown parsing engine. It's more important to understand the tools, and their strengths and weaknesses, than it is to knuckle under to knee-jerk dogmatism .
...
Рейтинг: 0 / 0
Парсер
    #38357852
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile, дело не только в структуре документа, а еще и в его содержимом.
...
Рейтинг: 0 / 0
Парсер
    #38357925
Ermak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУпроблем пока не испытываю
Поправил :)

Может быть и так.
Разработку парсеров заказывают часто, так что ждемс...

PS. Просто набил руку на работе с RegEx.
...
Рейтинг: 0 / 0
Парсер
    #38357946
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всегда парсил HTML через родной IHTMLDocument2 (mshtml.tlb, ieframe.dll). Работало как часы. HtmlAgilityPack щупал, но в реальных проектах решил не использовать.
...
Рейтинг: 0 / 0
Парсер
    #38358007
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileРегулярные выражения это инструмент со своими плюсами и минусами.
Не затруднит озвучить плюсы регулярок по сравнению с парсером в данном конкретном случае? Вариант неумения пользоваться парсером в отличие от регулярок не предлагать.

МСУВсегда парсил HTML через родной IHTMLDocument2 (mshtml.tlb, ieframe.dll). Работало как часы. HtmlAgilityPack щупал, но в реальных проектах решил не использовать.
Насколько я помню, он не умеет XPath.
...
Рейтинг: 0 / 0
Парсер
    #38358018
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныbazileРегулярные выражения это инструмент со своими плюсами и минусами.
Не затруднит озвучить плюсы регулярок по сравнению с парсером в данном конкретном случае? Вариант неумения пользоваться парсером в отличие от регулярок не предлагать.Не надо тащить "левую" библиотеку в проект. Regex для простых случаев самое то.
...
Рейтинг: 0 / 0
Парсер
    #38358027
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНе надо тащить "левую" библиотеку в проект. Regex для простых случаев самое то.
Это трудоемко? Затратно? Еще что-то? Установка того же HTML Agility Pack через NuGet - дело 10 секунд.
...
Рейтинг: 0 / 0
Парсер
    #38358036
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныНасколько я помню, он не умеет XPath.И не должен уметь. Об абсолютно html-валидную конструкцию <i><b></i></b> xpath сломает зубы.

В html5 появился document.querySelector/querySelectorAll, не уступающий по мощности xpath. Селекторы jQuery это копипаста querySelector.
...
Рейтинг: 0 / 0
Парсер
    #38358040
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныАлексей КНе надо тащить "левую" библиотеку в проект. Regex для простых случаев самое то.
Это трудоемко? Затратно? Еще что-то? Установка того же HTML Agility Pack через NuGet - дело 10 секунд.Если задача решается десятком строчек без "левой" библиотеки, зачем тащить в проект "левую" библиотеку?


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
        string GetTagContent(string tagName, string content)
        {
            var beginTagPattern = string.Format(@"< \s* {0} .*? >", tagName);
            var endTagPattern = string.Format(@"</ \s* {0} \s* >", tagName);

            var pattern = string.Format(
                @"(?<={0}) .* (?={1})",
                beginTagPattern,
                endTagPattern
            );

            return Regex
                .Match(content, pattern, TagParseOptions)
                .Value;
        }
...
Рейтинг: 0 / 0
Парсер
    #38358049
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныНасколько я помню, он не умеет XPath.
А должен уметь? Для этого курим ObjectXPathNavigator.
...
Рейтинг: 0 / 0
Парсер
    #38358053
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНе надо тащить "левую" библиотеку в проект. Regex для простых случаев самое то.
Я тоже не люблю левые сборки. Так на то есть виндовой IHTMLDocument2 / IHTMLDocument3.
...
Рейтинг: 0 / 0
Парсер
    #38358156
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныНе затруднит озвучить плюсы регулярок по сравнению с парсером в данном конкретном случае?
- простое решение для простой задачи используя только средства базовой библиотеки
- избегаем использовование внешней библиотеки
- нет необходимости тратить время на изучение новой библиотеки (для тех кто ранее не работал с HtmlAgilityPack)

При этом конечно помним про недостаток - риск превращения регулярки и кода в ктулху-стиль как это называет Атвуд. Как только появились признаки такого стиля следует переключиться на другие решения.
...
Рейтинг: 0 / 0
Парсер
    #38358257
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУТак на то есть виндовой IHTMLDocument2 / IHTMLDocument3.Не знал, но подозревал что должно быть. :-)
...
Рейтинг: 0 / 0
25 сообщений из 163, страница 1 из 7
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Парсер
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]