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

Gumbo HTML5 парсер от Google

Запись от Dmitriy_M размещена 07.10.2013 в 11:26
Метки 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 Кб, 244 просмотров)
Размещено в Без категории
Просмотров 3207 Комментарии 4
Всего комментариев 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 вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru