Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2015, 19:05   #1
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию Правильный парсинг html в Qt

Здравствуйте.

Необходимо парсить html средствами Qt.

Я это делаю следующим образом:

Код:
    QWebPage WebPage;
    WebPage.mainFrame()->setHtml(HtmlText);
    QWebElement WebElement =  WebPage.mainFrame()->documentElement();
Далее уже с помощью QWebElement можно парсить html.

Правильный ли это подход для решение такой задачи?

То при закрытии приложения выдает ошибки в окно дебага:

LEAK: 5 CachedResource
LEAK: 4258 WebCoreNode

Которые говорят об утечке памяти.

Заранее благодарен.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 04.06.2015, 00:06   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Цитата:
LEAK: 5 CachedResource
LEAK: 4258 WebCoreNode
Эта проблема не решается. Вроде находил, где официально баги публикуют. На форумах пишут, что в этом нет ничего страшного, так как проблема возникает в момент закрытия приложения
8Observer8 вне форума Ответить с цитированием
Старый 04.06.2015, 08:34   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
проблема возникает в момент закрытия приложения
Ну это легко проверить - парсим сайт 100500 тысяч раз и смотрим на количество утечек.
waleri вне форума Ответить с цитированием
Старый 04.06.2015, 18:51   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Я решения не нашёл. С этими утечками пришлось смириться
8Observer8 вне форума Ответить с цитированием
Старый 04.06.2015, 19:18   #5
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ну это легко проверить - парсим сайт 100500 тысяч раз и смотрим на количество утечек.
Я проверил, если использовать такой парсинг, то утечка памяти действительно есть, и зависит от размера данных которые устанавливаются с помощью setHtml().

Выходит что-то неправильно делаю, утечки не должно быть.
У меня версия Qt: 5.1.1
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 13.06.2015, 23:24   #6
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Теперь еще кроме утечки памяти столкнулся с проблемой использования QWebPage в потоке.

Если я использую QWebPage в потоке, то приложение крашит:

ASSERT failure in QWidget: "Widgets must be created in the GUI thread.", file kernel\qwidget.cpp, line 1485
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.

Можно ли как-то записать html в QWebElement не используя QWebPage?
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 21.06.2015, 17:58   #7
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Решил все проблемы использованием библиотеки libxml2.
Очень помогла эта статья.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 26.06.2015, 18:51   #8
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Были проблемы с кодировками, но вроде разобрался, задать кодировку парсеру можно следующим образом:


Код:
    xmlParserCtxt* context;
    // ...
    // Создаем context и т.п. (НО НЕ ЗАПУСКАЕМ ПАРСЕР)
    // ...

    QByteArray codecName("windows-1251");

    //  Создаем xmlChar строку на основе codecName
    xmlChar *codec;
    codec = xmlStrndup((xmlChar*)codecName.constData(),codecName.size());

    //  Устанавливаем название кодировки для входящих данных в контекст
    if (context->input->encoding != 0){
        xmlFree((xmlChar *) context->input->encoding);
    }
    context->input->encoding = codec;

    //  Проверяем знает ли libxml2 данную кодировку
    xmlCharEncodingHandlerPtr EncodingHandler;
    EncodingHandler= xmlFindCharEncodingHandler((const char *) codec);
    if (EncodingHandler != 0) {
        // Переключаемся на эту кодировку
        xmlSwitchToEncoding(context, EncodingHandler);
    }else{
        // Ошибка
        return false;
    }

    context->charset = XML_CHAR_ENCODING_UTF8;
При таком переключении кодировки все данные полученные от парсера приходят в UTF-8 и парсер не обращает внимание на кодировку в тегах meta.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг html... kta87 Общие вопросы Delphi 3 06.04.2012 12:13
парсинг HTML Gregor HTML и CSS 0 07.10.2011 09:24
Парсинг HTML Che Guevara PHP 4 21.07.2011 19:28
парсинг Html eldar Общие вопросы Delphi 4 23.04.2009 20:42
HTML Парсинг BaikalLord Помощь студентам 5 15.12.2008 08:20