Форум программистов и сисадминов CyberForum.ru
Вернуться   Форум программистов и сисадминов 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 г.
Тип техники: Мотоцикл
Состояние: отличное
Покажите пожалуйста, программа проекта очень большая, а это лишь ее маленький кусочек, буду рад любой помощи
Старый 02.11.2012, 05:43   #2
fanatdebian
Z3JheSBoYXQ=
 
Аватар для fanatdebian
 
Регистрация: 08.07.2012
Сообщений: 551
Репутация: 323 (218)
Лучшие ответы: 4
Программа для разбора HTML на Си

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

liblxml2
Старый 02.11.2012, 10:10   #4
Evg
Форумчанин
Эксперт C++
Автор FAQ
 
Аватар для Evg
 
Регистрация: 30.03.2009
Сообщений: 11,574
Репутация: 14127 (4090)
Записей в блоге: 23
Лучшие ответы: 163
Программа для разбора 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
Google
Объявления
Старый 02.11.2012, 10:15   #5
Nameless One
Форумчанин
Эксперт C++
 
Аватар для Nameless One
 
Регистрация: 08.02.2010
Сообщений: 6,978
Репутация: 5387 (3198)
Лучшие ответы: 134
Программа для разбора HTML на Си

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

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

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

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

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

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

При простом проходе между символами '<' и '>' нужно не забывать, что в html некоторые символы эскейпятся (&gt; &lt. Но правильную мысль тут уже высказали - проще написать не с нуля, а с использованием готовых, протестированных библиотек (например, на python).
Старый 05.11.2012, 12:50   #10
accept
Форумчанин
 
Регистрация: 10.12.2008
Сообщений: 10,678
Репутация: 4800 (3200)
Лучшие ответы: 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
Объявления
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Автор
С++ для начинающих Программа разбора и вычисления значения арифметического выражения
Написать программу разбора и вычисления значения арифметического выражения. На входе программы — строка, содержащая числа, скобки «(» и «)» и знаки 4-х арифметических операций: + - * / На выходе — результат вычисления. Использовать промежуточное представление выражения в обратной польской...
Malz
Алгоритмы Программа морфологического разбора ТЕКСТА!
Помогите пожалуйста с написанием программы морфологического разбора ТЕКСТА! на Visual C++ или Builder C++ !!!
Fenix
Заказать программу программа разбора TDMA кадров
доброго времени суток, уважаемые товарищи! есть задача по написанию программы для разбора информационных кадров формата TDMA (или CDMA, GSM, любой кадр моб.сетей). Подробности в асе. 4 три 9 0 4 4 девять 6 четыре
XirurG
Visual C++ Программа морфологического разбора текста!
Исправить ошибки в программе морфологического разбора текста!
Fenix
Delphi Классы и методы для разбора XML файла
Подскажите какой класс или модуль подключить, какие обьекты создавать/вызывать, функции и методы. Можт ссылки на инфу в Инете кто знает по этой теме. Заранее благодарю.
smoyk
Опции темы

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

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