Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C (Си)

Войти
Регистрация
Восстановить пароль
 
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
#1

Программа для разбора HTML на Си - C (Си)

28.10.2012, 00:34. Просмотров 1001. Ответов 9
Метки нет (Все метки)

Задача состоит вот в чем. Начнем с простого. В теме Парсер 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 г.
Тип техники: Мотоцикл
Состояние: отличное
Покажите пожалуйста, программа проекта очень большая, а это лишь ее маленький кусочек, буду рад любой помощи
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2012, 00:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа для разбора HTML на Си (C (Си)):

Конечный автомат для разбора математических выражений - C (СИ)
Написал конечный автомат для разбора математических выражений вида 2*5 - 10/(5-3)*(2)+1 . Мне нужно добавить в него функции вида...

YACC/ синтаксический анализатор для грамматического разбора входного потока цифровой информации - C Linux
Проблема состоит в том, что не получается разработать синтаксический анализатор для грамматического разбора входного потока цифровой...

Регулярное выражение для разбора html - C#
помогите написать регулярку разбора хтмл тега

Программа, считывающая диапазон и выдающая «OK» в случае успешного разбора или «FAIL» в случае неуспешного разбора - Visual C++
Здравствуйте! Недавно начал изучать Visual C++ и пока не получается сделать программу, а очень надо. Вот задание. Написать программу,...

Программа для разбора кода php - PHP
доброе время суток! мне в наследство по работе остался сайт, который мягко говоря написан школьником... в нем нет классов, говорить о...

Программа морфологического разбора ТЕКСТА! - Алгоритмы
Помогите пожалуйста с написанием программы морфологического разбора ТЕКСТА! на Visual C++ или Builder C++ !!!

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
fanatdebian
Z3JheSBoYXQ=
336 / 231 / 35
Регистрация: 08.07.2012
Сообщений: 577
02.11.2012, 05:43 #2
Для подобного рода проектов, где требуется парсинг рекомендую автору треда использовать Python. Благо семантика питона пришла в бОльшей степени из Си. Если знаешь Си писать на питоне нормально начнешь через сутки.
Просто и си и питон всего лишь инструменты. А затраты времени на реализацию и простота кода в результате будет в этом конкретном случае не в пользу Си.
2
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
02.11.2012, 07:47 #3
liblxml2
1
Evg
Эксперт CАвтор FAQ
17812 / 6022 / 388
Регистрация: 30.03.2009
Сообщений: 16,546
Записей в блоге: 26
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;
}
1
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
02.11.2012, 10:15 #5
Цитата Сообщение от Evg Посмотреть сообщение
Ему не нужно парсить страницу на запчасти. Ему нужно тэги отфильтровать. Самый тупой вариант - читаешь из одной строки и переписываешь в другую строку, игнорируя всё, что начинается с символа "<" и заканчивается символом ">"
Evg, если так, то да, соглашусь, отдельный парсер не нужен.
1
Evg
Эксперт CАвтор FAQ
17812 / 6022 / 388
Регистрация: 30.03.2009
Сообщений: 16,546
Записей в блоге: 26
02.11.2012, 10:35 #6
Цитата Сообщение от Nameless One Посмотреть сообщение
Evg, если так, то да, соглашусь, отдельный парсер не нужен.
Хотя проморгал я... ему табличные данные надо получать. Так что простая отфильтровка тэгов поможет только в частных случаях, если страница не сильно плавает во времени
1
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
02.11.2012, 10:48 #7
Evg, судя по примерам, тут единственная проблема - ставить перевод строки после каждой строки таблицы, но и она решаема (если при фильтрации запоминать последний закрывающий тег).

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

Настоящая проблема появится в том случае, если приведенные примеры являются лишь фрагментами html-страниц. Тогда без полноценного парсера не обойтись.
Цитата Сообщение от Evg Посмотреть сообщение
если страница не сильно плавает во времени
Вот тут не понял.
2
Evg
Эксперт CАвтор FAQ
17812 / 6022 / 388
Регистрация: 30.03.2009
Сообщений: 16,546
Записей в блоге: 26
02.11.2012, 17:58 #8
Цитата Сообщение от Nameless One Посмотреть сообщение
Вот тут не понял
Сайты имеют вэбмастеров, которые, в свою очередь, временами имеют желание что-нибудь аккуратно подправить (например, убрать переводы строк из таблицы, убрать символ двоеточия и т.п.)
0
serejkus
47 / 45 / 4
Регистрация: 31.10.2011
Сообщений: 98
04.11.2012, 12:26 #9
При простом проходе между символами '<' и '>' нужно не забывать, что в html некоторые символы эскейпятся (&gt; &lt. Но правильную мысль тут уже высказали - проще написать не с нуля, а с использованием готовых, протестированных библиотек (например, на python).
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.11.2012, 12:50 #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> и другие
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2012, 12:50
Привет! Вот еще темы с ответами:

Программа морфологического разбора текста! - Visual C++
Исправить ошибки в программе морфологического разбора текста!

Программа разбора и вычисления значения арифметического выражения - C++
Написать программу разбора и вычисления значения арифметического выражения. На входе программы — строка, содержащая числа, скобки «(» и...

Построение решающих LR разбора и LL разбора - Pascal
вообщем требуют сдачу долгов по учёбе..а я работаю некогда делать..поэтому обращаюсь сюда. скину уже готовый вариант. но с дугим...

Программа для PHP и HTML - PHP
Есть код , использую программы PHPdesinger7 , notpad++ , dreamweaver . Меня интересует такой вопрос , если я скопировал текс HTML , или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.11.2012, 12:50
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru