Форум программистов, компьютерный форум CyberForum.ru Форум программистов | Компьютерный форум | Форум web-программистов | Форум по электронике и бытовой технике | Форум о софте | Научный форум | Карьера и бизнес
CyberForum.ru - форум программистов и сисадминов > Форум Форум программистов > Форум C (Си)
Восстановить пароль Регистрация

Ответ Создать новую тему
 
28.10.2012, 00:34   #1
Egeni
Форумчанин
Регистрация: 17.06.2010
Сообщений: 107
Репутация: 10 (10)
Записей в блоге: 1
Программа для разбора HTML на Си / C (Си)

Задача состоит вот в чем. Начнем с простого. В теме Парсер HTML лежит файл с примерами заданий Razbor.rar
Есть вебстраница формата пример razbor1.htm
Код HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<table align="center" border="0" cellpadding="0" cellspacing="0" width="600">
<tbody><tr> 
<td><b>
Требуются: каменщики, разнорабочие, штукатуры Tел. 93-22-51, 65-52-55</b></td>
</tr>          
</tbody></table>
<br>
<table align="center" border="0" cellpadding="0" cellspacing="0" width="600">
<tbody><tr> 
<td>
Требуются кладовщики Tел. 54-19-30</td>
</tr>
</tbody></table>
<br>
<table align="center" border="1" cellpadding="0" cellspacing="0" width="600">
<tbody><tr> 
<td><b>
Требуются разнорабочие Tел. 066-672-26-23</b></td>
</tr>          
</tbody></table>

Необходимо привести к разобранному виду и занести табличные данные в бд
Требуются: каменщики, разнорабочие, штукатуры Tел. 93-22-51, 65-52-55
Требуются кладовщики Tел. 54-19-30
Требуются разнорабочие Tел. 066-672-26-23

____________________________________________________________ _______
Ну и вот еще razbor2.htm
Код HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 <table cellSpacing=0 cellPadding=0 width="100%" border="0" class="pdr">
 <tr>
  <td><b>Год выпуска:</b></td>
  <td class="a_r">2011 г.</td>
 </tr>
 <tr><td class="sep_h" colspan="2"><img src="/img/z.gif" width="1px" height="1px" alt="" /></td></tr>
 <tr>
  <td><b>Тип техники:</b></td>
  <td class="a_r">Мотоцикл</td>
 </tr>
 <tr><td class="sep_h" colspan="2"><img src="/img/z.gif" width="1px" height="1px" alt="" /></td></tr>
 <tr>
  <td><b>Состояние:</b></td>
  <td class="a_r">отличное</td>
 </tr>
 </tr>
Аналогично необходимо убрать весь мусор(html теги) и получить на выходе табличные данные чтобы занести в бд

Год выпуска: 2011 г.
Тип техники: Мотоцикл
Состояние: отличное
Покажите пожалуйста, программа проекта очень большая, а это лишь ее маленький кусочек, буду рад любой помощи
28.10.2012, 00:34
AdAgent
Объявления
02.11.2012, 05:43   #2
fanatdebian
Z3JheSBoYXQ=
Регистрация: 08.07.2012
Сообщений: 551
Репутация: 323 (218)
Лучшие ответы: 4
Программа для разбора HTML на Си

Для подобного рода проектов, где требуется парсинг рекомендую автору треда использовать Python. Благо семантика питона пришла в бОльшей степени из Си. Если знаешь Си писать на питоне нормально начнешь через сутки.
Просто и си и питон всего лишь инструменты. А затраты времени на реализацию и простота кода в результате будет в этом конкретном случае не в пользу Си.
Другие темы раздела
C (Си) Работа с JPEG и BMP
Здраствуйте, мне надо сделать компрессор изображений из формата JPEG в формат BMP (консольно), на обычном Си (используя ТОЛЬКО стандартные библиотеки Си), но я не представляю как будет проходить этот процесс (перерыл весь гугл, ничего толкового не нашёл...). Может кто-нибудь сможет помочь (советом,...
C (Си) Получение курса валют/ погоды/ времени
Подскажите пожалуйста алгоритм и доступные библиотеки. Хотел научить программу скачивать курс валют / погоды / точного времени. Возможно записывать в файл или добавлять в базу данных. Подскажите гуру С, огромное спасибо заранее! Добавлено через 26 минут Хочу изучить именно С или С++, для...
02.11.2012, 07:47   #3
Nameless One
Форумчанин
Эксперт C++
Регистрация: 08.02.2010
Сообщений: 7,061
Репутация: 5513 (3231)
Лучшие ответы: 137
Программа для разбора HTML на Си

liblxml2
02.11.2012, 10:10   #4
Evg
Форумчанин
Эксперт C++
Автор FAQ
Регистрация: 30.03.2009
Сообщений: 11,623
Репутация: 14261 (4131)
Записей в блоге: 23
Лучшие ответы: 167
Программа для разбора HTML на Си

Цитата Сообщение от Nameless One Посмотреть сообщение
Ему не нужно парсить страницу на запчасти. Ему нужно тэги отфильтровать. Самый тупой вариант - читаешь из одной строки и переписываешь в другую строку, игнорируя всё, что начинается с символа "<" и заканчивается символом ">"

Добавлено через 9 минут
Когда-то давно сделал себе быстрый набросок по вырезанию тэгов на Си, а потом перешёл на Lua. Программа писалась на Borland'е на C++, но, поскольку я плохо владею плюсами, то фактически писал на Си. В UnTagString подаётся строка, содержащая текст с сайта, на выходе формируется строка с отфильтрованными тэгами

Код 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
// Вырезание в буфере фрагментов от start по end
static void
CutInBuff (char *buff, const char *start, const char *end)
{
    char *p, *pp, *ppp;
 
    while (1)
    {
        p = strstr (buff, start);
        if (p == NULL)
          break;
 
        pp = strstr (p, end);
        if (pp == NULL)
          break;
 
        ppp = pp + strlen (end);
 
        // Итого p смотрит на начало строки start, а ppp смотрит на первый
        // символ после end. Копируем пересекающиеся участки, поэтому
        // используем memmove. Скопировать надо вместе с завершающим нулём,
        // поэтому копируем на 1 байт больше, чем строковая длина хвоста
        memmove (p, ppp, strlen (ppp) + 1);
    }
}
 
// Процедура НЕ универсальная. Здесь делается только то, чего достаточно для
// нашего случая
AnsiString
UnTagString (const AnsiString &str)
{
    char *buff;
    const char *p;
    AnsiString res_str;
 
    // Продублируем строку, т.к. часть вырезания делается прямо в строке
    buff = strdup (str.c_str());
 
    // Вырежем заведомо ненужные куски
    CutInBuff (buff, "<!--", "-->");
    CutInBuff (buff, "<script", "</script>");
    CutInBuff (buff, "<style", "</style>");
 
    // Вырезаем тэги
    for (p = buff; *p != 0; p++)
    {
        // Пропускаем всё между угловыми скобками (их может быть
        // несколько подряд). При этом к результирующей строке добавим
        // пробел, чтобы оставшиеся строки не прилипали друг к другу
        if (*p == '<')
        {
            res_str += ' ';
            while (*p == '<')
            {
                while (*p != 0 && *p != '>')
                  p++;
                p++;
            }
        }
 
        // Полезный символ
        res_str += *p;
    }
 
    free (buff);
    return res_str;
}
02.11.2012, 10:10
AdAgent
Объявления
02.11.2012, 10:15   #5
Nameless One
Форумчанин
Эксперт C++
Регистрация: 08.02.2010
Сообщений: 7,061
Репутация: 5513 (3231)
Лучшие ответы: 137
Программа для разбора HTML на Си

Цитата Сообщение от Evg Посмотреть сообщение
Ему не нужно парсить страницу на запчасти. Ему нужно тэги отфильтровать. Самый тупой вариант - читаешь из одной строки и переписываешь в другую строку, игнорируя всё, что начинается с символа "<" и заканчивается символом ">"
Evg, если так, то да, соглашусь, отдельный парсер не нужен.
02.11.2012, 10:35   #6
Evg
Форумчанин
Эксперт C++
Автор FAQ
Регистрация: 30.03.2009
Сообщений: 11,623
Репутация: 14261 (4131)
Записей в блоге: 23
Лучшие ответы: 167
Программа для разбора HTML на Си

Цитата Сообщение от Nameless One Посмотреть сообщение
Evg, если так, то да, соглашусь, отдельный парсер не нужен.
Хотя проморгал я... ему табличные данные надо получать. Так что простая отфильтровка тэгов поможет только в частных случаях, если страница не сильно плавает во времени
02.11.2012, 10:48   #7
Nameless One
Форумчанин
Эксперт C++
Регистрация: 08.02.2010
Сообщений: 7,061
Репутация: 5513 (3231)
Лучшие ответы: 137
Программа для разбора HTML на Си

Evg, судя по примерам, тут единственная проблема - ставить перевод строки после каждой строки таблицы, но и она решаема (если при фильтрации запоминать последний закрывающий тег).

Также для данной задачи можно взять регулярные выражения, хотя, конечно же, в общем случае использовать их для парсинга html плохо.

Настоящая проблема появится в том случае, если приведенные примеры являются лишь фрагментами html-страниц. Тогда без полноценного парсера не обойтись.
Цитата Сообщение от Evg Посмотреть сообщение
если страница не сильно плавает во времени
Вот тут не понял.
02.11.2012, 17:58   #8
Evg
Форумчанин
Эксперт C++
Автор FAQ
Регистрация: 30.03.2009
Сообщений: 11,623
Репутация: 14261 (4131)
Записей в блоге: 23
Лучшие ответы: 167
Программа для разбора HTML на Си

Цитата Сообщение от Nameless One Посмотреть сообщение
Вот тут не понял
Сайты имеют вэбмастеров, которые, в свою очередь, временами имеют желание что-нибудь аккуратно подправить (например, убрать переводы строк из таблицы, убрать символ двоеточия и т.п.)
04.11.2012, 12:26   #9
serejkus
Форумчанин
Регистрация: 31.10.2011
Сообщений: 98
Репутация: 42 (40)
Лучшие ответы: 1
Программа для разбора HTML на Си

При простом проходе между символами '<' и '>' нужно не забывать, что в html некоторые символы эскейпятся (&gt; &lt. Но правильную мысль тут уже высказали - проще написать не с нуля, а с использованием готовых, протестированных библиотек (например, на python).
05.11.2012, 12:50   #10
accept
Форумчанин
Регистрация: 10.12.2008
Сообщений: 10,680
Репутация: 4809 (3209)
Лучшие ответы: 34
Программа для разбора HTML на Си / C (Си)

Цитата Сообщение от Egeni Посмотреть сообщение
Код XML
1
2
3
4
5
6
<table align="center" border="0" cellpadding="0" cellspacing="0" width="600">
<tbody><tr> 
<td><b>
Требуются: каменщики, разнорабочие, штукатуры Tел. 93-22-51, 65-52-55</b></td>
</tr>          
</tbody></table>
когда встретился тег <table, начать искать <tbody
когда встретился тег <tbody, начать искать <td
когда встретился тег <td, начать искать </td>, сохраняя содержимое
когда встретился тег </td>, начать искать </tbody>
когда встретился тег </tbody>, начать искать </table>

сохранённое содержимое пропускается через фильтр, который убирает возможно сохранённые теги <b>, </b> и другие
05.11.2012, 12:50
Yandex
Объявления
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Раздел Автор Дата
Visual C++: Программа, считывающая диапазон и выдающая «OK» в случае успешного разбора или «FAIL» в случае неуспешного разбора
Здравствуйте! Недавно начал изучать Visual C++ и пока не получается сделать программу, а очень надо. Вот задание. Написать программу, считывающая диапазон и выдающая в конце сообщения «OK» в случае успешного разбора или «FAIL» в случае неуспешного разбора. Диапазоны записывать в следующем...
Visual C++ Jin200611 16.06.2013 18:52
C++: Программа разбора и вычисления значения арифметического выражения
Написать программу разбора и вычисления значения арифметического выражения. На входе программы — строка, содержащая числа, скобки «(» и «)» и знаки 4-х арифметических операций: + - * / На выходе — результат вычисления. Использовать промежуточное представление выражения в обратной польской...
С++ для начинающих Malz 27.09.2012 19:39
Программа морфологического разбора ТЕКСТА! - Алгоритмы
Помогите пожалуйста с написанием программы морфологического разбора ТЕКСТА! на Visual C++ или Builder C++ !!!
Алгоритмы Fenix 28.04.2010 01:15
программа разбора TDMA кадров - Заказать программу
доброго времени суток, уважаемые товарищи! есть задача по написанию программы для разбора информационных кадров формата TDMA (или CDMA, GSM, любой кадр моб.сетей). Подробности в асе. 4 три 9 0 4 4 девять 6 четыре
Заказать программу XirurG 31.03.2010 19:37
Visual C++: Программа морфологического разбора текста!
Исправить ошибки в программе морфологического разбора текста!
Visual C++ Fenix 22.06.2009 19:48
Опции темы

Текущее время: 20:24. Часовой пояс GMT +4.

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2014, vBulletin Solutions, Inc.