Форум программистов, компьютерный форум CyberForum.ru
CyberForum.ru - форум программистов и сисадминов > >
Восстановить пароль Регистрация
 
Egeni
Форумчанин
10 / 10 / 0
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
28.10.2012, 01:34     Программа для разбора HTML на Си   #1
Задача состоит вот в чем. Начнем с простого. В теме Парсер 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 г.
Тип техники: Мотоцикл
Состояние: отличное
Покажите пожалуйста, программа проекта очень большая, а это лишь ее маленький кусочек, буду рад любой помощи
AdAgent
Объявления
28.10.2012, 01:34     Программа для разбора HTML на Си
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2012, 01:34     Программа для разбора HTML на Си
Посмотрите здесь:

C (СИ) Программа для книголюба
C (СИ) программа для начинающих
C (СИ) Программа для возраста человека
C (СИ) Программа для искажения текстов
C (СИ) программа для работы с прямоугольниками
fanatdebian
Z3JheSBoYXQ=
332 / 227 / 5
Регистрация: 08.07.2012
Сообщений: 573
02.11.2012, 06:43     Программа для разбора HTML на Си   #2
Для подобного рода проектов, где требуется парсинг рекомендую автору треда использовать Python. Благо семантика питона пришла в бОльшей степени из Си. Если знаешь Си писать на питоне нормально начнешь через сутки.
Просто и си и питон всего лишь инструменты. А затраты времени на реализацию и простота кода в результате будет в этом конкретном случае не в пользу Си.
Nameless One
Форумчанин
Эксперт C++
5571 / 3289 / 141
Регистрация: 08.02.2010
Сообщений: 7,205
02.11.2012, 08:47     Программа для разбора HTML на Си   #3
liblxml2
Evg
Форумчанин
Эксперт C++
Автор FAQ
14448 / 4317 / 191
Регистрация: 30.03.2009
Сообщений: 12,143
Записей в блоге: 25
02.11.2012, 11:10     Программа для разбора HTML на Си   #4
Цитата Сообщение от 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;
}
Nameless One
Форумчанин
Эксперт C++
5571 / 3289 / 141
Регистрация: 08.02.2010
Сообщений: 7,205
02.11.2012, 11:15     Программа для разбора HTML на Си   #5
Цитата Сообщение от Evg Посмотреть сообщение
Ему не нужно парсить страницу на запчасти. Ему нужно тэги отфильтровать. Самый тупой вариант - читаешь из одной строки и переписываешь в другую строку, игнорируя всё, что начинается с символа "<" и заканчивается символом ">"
Evg, если так, то да, соглашусь, отдельный парсер не нужен.
AdAgent
Объявления
02.11.2012, 11:15     Программа для разбора HTML на Си
Evg
Форумчанин
Эксперт C++
Автор FAQ
14448 / 4317 / 191
Регистрация: 30.03.2009
Сообщений: 12,143
Записей в блоге: 25
02.11.2012, 11:35     Программа для разбора HTML на Си   #6
Цитата Сообщение от Nameless One Посмотреть сообщение
Evg, если так, то да, соглашусь, отдельный парсер не нужен.
Хотя проморгал я... ему табличные данные надо получать. Так что простая отфильтровка тэгов поможет только в частных случаях, если страница не сильно плавает во времени
Nameless One
Форумчанин
Эксперт C++
5571 / 3289 / 141
Регистрация: 08.02.2010
Сообщений: 7,205
02.11.2012, 11:48     Программа для разбора HTML на Си   #7
Evg, судя по примерам, тут единственная проблема - ставить перевод строки после каждой строки таблицы, но и она решаема (если при фильтрации запоминать последний закрывающий тег).

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

Настоящая проблема появится в том случае, если приведенные примеры являются лишь фрагментами html-страниц. Тогда без полноценного парсера не обойтись.
Цитата Сообщение от Evg Посмотреть сообщение
если страница не сильно плавает во времени
Вот тут не понял.
Evg
Форумчанин
Эксперт C++
Автор FAQ
14448 / 4317 / 191
Регистрация: 30.03.2009
Сообщений: 12,143
Записей в блоге: 25
02.11.2012, 18:58     Программа для разбора HTML на Си   #8
Цитата Сообщение от Nameless One Посмотреть сообщение
Вот тут не понял
Сайты имеют вэбмастеров, которые, в свою очередь, временами имеют желание что-нибудь аккуратно подправить (например, убрать переводы строк из таблицы, убрать символ двоеточия и т.п.)
serejkus
Форумчанин
42 / 40 / 1
Регистрация: 01.11.2011
Сообщений: 98
04.11.2012, 13:26     Программа для разбора HTML на Си   #9
При простом проходе между символами '<' и '>' нужно не забывать, что в html некоторые символы эскейпятся (&gt; &lt. Но правильную мысль тут уже высказали - проще написать не с нуля, а с использованием готовых, протестированных библиотек (например, на python).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2012, 13:50     Программа для разбора HTML на Си
Еще ссылки по теме:

C (СИ) Программа для таблицы истинности
C (СИ) Программа для учебного стенда СУ-МК
C (Си) Программа для команды
accept
Форумчанин
4813 / 3213 / 34
Регистрация: 10.12.2008
Сообщений: 10,680
05.11.2012, 13:50     Программа для разбора HTML на Си   #10
Цитата Сообщение от 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> и другие
Yandex
Объявления
05.11.2012, 13:50     Программа для разбора HTML на Си
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Опции темы

Текущее время: 00:39. Часовой пояс GMT +4.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2014, vBulletin Solutions, Inc.
Яндекс.Метрика