Форум программистов, компьютерный форум, киберфорум
Dmitriy_M
Войти
Регистрация
Восстановить пароль

Gumbo HTML5 парсер от Google

Запись от Dmitriy_M размещена 07.10.2013 в 11:26
Показов 15623 Комментарии 4
Метки gumbo, html5, parser

Gumbo прасер HTML5 от Google написанный на Си, и не имеющий никаких зависимостей, кроме компилятора C99.
Правда под MSVC компилировать следует в режиме C++.

Страница проекта, сборка при помощи cmake.

Пользоваться Gumbo, не просто, а очень просто(если конечно же есть опыт использования XML DOM парсеров).
Список структур:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
GumboSourcePosition
GumboStringPiece
GumboVector
GumboAttribute
GumboDocument
GumboText
GumboElement
GumboNode
GumboOptions
GumboOutput

Список функций:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
bool    gumbo_string_equals (const GumboStringPiece *str1, const GumboStringPiece *str2)
bool    gumbo_string_equals_ignore_case (const GumboStringPiece *str1, const GumboStringPiece *str2)
int     gumbo_vector_index_of (GumboVector *vector, void *element)
const char *    gumbo_normalized_tagname (GumboTag tag)
void    gumbo_tag_from_original_text (GumboStringPiece *text)
const char *    gumbo_normalize_svg_tagname (const GumboStringPiece *tagname)
GumboTag    gumbo_tag_enum (const char *tagname)
GumboAttribute *    gumbo_get_attribute (const GumboVector *attrs, const char *name)
GumboOutput *   gumbo_parse (const char *buffer)
GumboOutput *   gumbo_parse_with_options (const GumboOptions *options, const char *buffer, size_t buffer_length)
void    gumbo_destroy_output (const GumboOptions *options, GumboOutput *output)


Парсинг и построение дерева производиться функцией gumbo_parse, если нужно с определенными опциями gumbo_parse_with_options. Освобождение ресурсов производиться функцией gumbo_destroy_output.
C++
1
2
3
4
5
6
7
8
9
10
std::string contents;
in.seekg(0, std::ios::end);
contents.resize(in.tellg());
in.seekg(0, std::ios::beg);
in.read(&contents[0], contents.size());
in.close();
 
GumboOutput* output = gumbo_parse(contents.c_str());
do_something(output->root);
gumbo_destroy_output(&kGumboDefaultOptions, output);
Простой рекурсивный обход дерева
C
1
2
3
4
5
6
7
8
9
10
11
12
13
void do_something(const GumboNode* node)
{
    if (node->type != GUMBO_NODE_ELEMENT)
    {
        return;
    }
 
    const GumboVector* children = &node->v.element.children;
    for (size_t i = 0; i < children->length; ++i)
    {
        do_something(static_cast<GumboNode*>(children->data[i]));
    }
}
Узел может быть следующих типов:
  • GUMBO_NODE_DOCUMENT документ,
  • GUMBO_NODE_ELEMENT элемент,
  • GUMBO_NODE_TEXT текст,
  • GUMBO_NODE_CDATA CDATA хранимая в GumboText,
  • GUMBO_NODE_COMMENT комментарий хранимый в GumboText,
  • GUMBO_NODE_WHITESPACE пробельные символы хранимые в GumboText.
Данные хранятся в поле v, которое представлено объединением:
C
1
2
3
4
5
6
union
{
    GumboDocument   document 
    GumboElement   element 
    GumboText   text 
}
Если узел GumboText и хочется вытащить текст node->v.text, стоит отметить, что UTF-8 пакуется в char*.

Основные поля GumboElement:
C
1
2
3
4
5
GumboVector children
GumboTag tag
GumboSourcePosition start_pos
GumboSourcePosition end_pos
GumboVector attributes
Тут в принципе все понятно. children вектор детей; tag перечисление тегов GUMBO_TAG_A,GUMBO_TAG_HR, GUMBO_TAG_IMG и т.д.; start_pos и end_pos позиция тега в html, содержит номер строки и номер столбца(удобное представление для человека), а так же смещение от начала html документа (очень удобно, если например хочется выдрать кусок HTML кода), attributes вектор атрибутов.
Для вытаскивания значения атрибута существует функция gumbo_get_attribute, которая возвращает атрибут по строке, или NULL если заданного атрибута там нет.
Пример:
C
1
2
3
4
5
6
GumboAttribute* href;
if (node->v.element.tag == GUMBO_TAG_A
    && (href = gumbo_get_attribute(&node->v.element.attributes, "href")))
{
    std::cout << href->value << std::endl;
}
В принципе этого достаточно. Исходный код документирован doxygen, для тех кто не знает что это такое прикладываю html документацию
Вложения
Тип файла: zip html.zip (178.6 Кб, 530 просмотров)
Метки gumbo, html5, parser
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 4
Комментарии
  1. Старый комментарий
    Аватар для Avazart
    Gumbo прасер HTML5 от Google написанный на Си, и не имеющий никаких зависимостей, кроме компилятораC99.
    Что из себя представляет ? Набор DLL ?
    Запись от Avazart размещена 31.10.2013 в 19:48 Avazart вне форума
  2. Старый комментарий
    Это небольшая либа на чистом Си.
    Список всех файлов для компиляции
    Кликните здесь для просмотра всего текста

    attribute.c
    char_ref.c
    error.c
    parser.c
    string_buffer.c
    string_piece.c
    tag.c
    tokenizer.c
    utf8.c
    util.c
    vector.c

    Его легко вкомилить в приложение или написать конфиг для qmake.
    Запись от Dmitriy_M размещена 31.10.2013 в 20:49 Dmitriy_M вне форума
  3. Старый комментарий
    Аватар для Avazart
    Хм.. очень интересно, нужно попробовать его собрать под С++Builder.
    Запись от Avazart размещена 02.11.2013 в 01:54 Avazart вне форума
  4. Старый комментарий
    воды много утекло со времени последнего комента. но все же...
    при использовании данного инструмента столкнулся с утечками памяти, небольшие но все же не очень приятно, хотя лечится легко и без вмешательства в исходники:
    определяем свои функции выделения и освобождения памяти, заносим адреса в struct GumboOptions и используем :
    C++
    1
    2
    3
    4
    5
    6
    7
    
    GumboOptions opt;
    opt.allocator   = alloc_memory; // учет выделения, к примеру в вектор std::vector<void*>  vc
    opt.deallocator = free_memory;// учет освобождения, удаляем void* из vc
    GumboOutput* output = gumbo_parse_with_options(&opt,contents.c_str(), contents.lenght());
    do_something(output->root);
    gumbo_destroy_output(&opt, output);
    //освобождаем то что осталось
    Запись от ssXXss размещена 25.04.2015 в 23:00 ssXXss вне форума
 
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru