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

Ответ Создать новую тему
 
Egeni
Форумчанин
10 / 10 / 0
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
28.10.2012, 00: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, 00:34
fanatdebian
Z3JheSBoYXQ=
323 / 218 / 4
Регистрация: 08.07.2012
Сообщений: 551
02.11.2012, 05:43
  #2
Для подобного рода проектов, где требуется парсинг рекомендую автору треда использовать Python. Благо семантика питона пришла в бОльшей степени из Си. Если знаешь Си писать на питоне нормально начнешь через сутки.
Просто и си и питон всего лишь инструменты. А затраты времени на реализацию и простота кода в результате будет в этом конкретном случае не в пользу Си.
Nameless One
Форумчанин
Эксперт C++
5538 / 3256 / 137
Регистрация: 08.02.2010
Сообщений: 7,122
02.11.2012, 07:47
  #3
liblxml2
Evg
Форумчанин
Эксперт C++
Автор FAQ
14302 / 4172 / 172
Регистрация: 30.03.2009
Сообщений: 11,714
Записей в блоге: 24
02.11.2012, 10:10
  #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++
5538 / 3256 / 137
Регистрация: 08.02.2010
Сообщений: 7,122
02.11.2012, 10:15
  #5
Цитата Сообщение от Evg Посмотреть сообщение
Ему не нужно парсить страницу на запчасти. Ему нужно тэги отфильтровать. Самый тупой вариант - читаешь из одной строки и переписываешь в другую строку, игнорируя всё, что начинается с символа "<" и заканчивается символом ">"
Evg, если так, то да, соглашусь, отдельный парсер не нужен.
Evg
Форумчанин
Эксперт C++
Автор FAQ
14302 / 4172 / 172
Регистрация: 30.03.2009
Сообщений: 11,714
Записей в блоге: 24
02.11.2012, 10:35
  #6
Цитата Сообщение от Nameless One Посмотреть сообщение
Evg, если так, то да, соглашусь, отдельный парсер не нужен.
Хотя проморгал я... ему табличные данные надо получать. Так что простая отфильтровка тэгов поможет только в частных случаях, если страница не сильно плавает во времени
Nameless One
Форумчанин
Эксперт C++
5538 / 3256 / 137
Регистрация: 08.02.2010
Сообщений: 7,122
02.11.2012, 10:48
  #7
Evg, судя по примерам, тут единственная проблема - ставить перевод строки после каждой строки таблицы, но и она решаема (если при фильтрации запоминать последний закрывающий тег).

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

Настоящая проблема появится в том случае, если приведенные примеры являются лишь фрагментами html-страниц. Тогда без полноценного парсера не обойтись.
Цитата Сообщение от Evg Посмотреть сообщение
если страница не сильно плавает во времени
Вот тут не понял.
Evg
Форумчанин
Эксперт C++
Автор FAQ
14302 / 4172 / 172
Регистрация: 30.03.2009
Сообщений: 11,714
Записей в блоге: 24
02.11.2012, 17:58
  #8
Цитата Сообщение от Nameless One Посмотреть сообщение
Вот тут не понял
Сайты имеют вэбмастеров, которые, в свою очередь, временами имеют желание что-нибудь аккуратно подправить (например, убрать переводы строк из таблицы, убрать символ двоеточия и т.п.)
serejkus
Форумчанин
42 / 40 / 1
Регистрация: 31.10.2011
Сообщений: 98
04.11.2012, 12:26
  #9
При простом проходе между символами '<' и '>' нужно не забывать, что в html некоторые символы эскейпятся (&gt; &lt. Но правильную мысль тут уже высказали - проще написать не с нуля, а с использованием готовых, протестированных библиотек (например, на python).
accept
Форумчанин
4810 / 3210 / 34
Регистрация: 10.12.2008
Сообщений: 10,680
05.11.2012, 12: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> и другие
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Раздел Автор Дата
Visual C++ Программа, считывающая диапазон и выдающая «OK» в случае успешного разбора или «FAIL» в случае неуспешного разбора
Здравствуйте! Недавно начал изучать Visual C++ и пока не получается сделать программу, а очень надо. Вот задание. Написать программу, считывающая диапазон и выдающая в конце сообщения «OK» в случае...
Visual C++ Jin200611 16.06.2013 18:52
C (СИ) программа для С
Помогите написать программу! Первоклассник Сидоров пришел в магазин за разливным молоком, но в продаже оказалось только бутылочное по цене с рублей за поллитра (с посудой). Пустая бутылка стоит p...
C для начинающих luybeznov 14.05.2013 19:22
C (СИ) Программа для тестирования
нужно написать прогамму в которой существует набор тестов нужно создать в варианте с оформлением я не знаю как выглядеть должно так при каждом первом запуске выходило окно с 6-ю ссылками на...
C для начинающих Djenadie 04.06.2012 10:46
C (СИ) разработка программы распознавания списка тегов HTML и подбор соответствующей структуры данных для хранения HTML документов
помогите пожалуйста решить задачу, в голову ничего не приходит "разработка программы распознавания списка тегов HTML и подбор соответствующей структуры данных для хранения HTML документов"! зараннее...
C для начинающих Bayirzhan 29.11.2011 19:01
C (СИ) программа для начинающих
Здравствуйте. Я начал изучать язык Си и сразу же встретился со сложнастями в синтаксисе и оформлении программы. делфи на начальном уровне знаю, и как бы понимаю смысл задачи,помогите пожалуйста,...
C для начинающих Егорка47 27.10.2010 19:29
C (СИ) Программа на Си для Borland 3.1
Дан файл f: file of real. Найти модуль суммы и квадрат произведения компонент файла f.:gsmile:
C для начинающих Tenataliya 09.05.2010 20:42
Программа морфологического разбора ТЕКСТА!
Помогите пожалуйста с написанием программы морфологического разбора ТЕКСТА! на Visual C++ или Builder C++ !!!
Алгоритмы Fenix 28.04.2010 01:15
программа разбора TDMA кадров
доброго времени суток, уважаемые товарищи! есть задача по написанию программы для разбора информационных кадров формата TDMA (или CDMA, GSM, любой кадр моб.сетей). Подробности в асе. 4 три 9 0 4 4...
Заказать программу XirurG 31.03.2010 19:37
Опции темы

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

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