В целях изучения C ++ и Qt я пишу небольшую программу на Qt, которая считывает HTML-файлы (до нескольких сотен) из локального каталога, изменяет их и записывает обратно в другой локальный каталог.
Моей первой попыткой было использование QWebPage
и функция парсинга HTML, предоставляемая QWebElement
.Однако я сталкиваюсь с некоторыми серьезными проблемами с утечками памяти, вызванными QWebPage
(что весьма вероятно вызвано моим неправильным использованием. Но это другая тема, а не часть этого вопроса).
К настоящему времени я не использую никакой графический интерфейс, и хотя я собираюсь сделать это позже, эта часть моей программы никогда не будет частью графического интерфейса, а где-то в фоновом режиме.
Таким образом, я заменяю использование QWebPage
на QTextBrowser
, что кажется более легким.Однако я не смог найти функции в Qt-API, подобные функциям синтаксического анализа QWebElement
.Пока мой код опирается на QWebElement::findFirst()
, QWebElement::nextSibling()
и, наконец, QWebElement::takeFromDocument()
.
Итак, есть ли практически безболезненная возможность реализации (или использования) QTextBrowser
в качестве HTML-парсера?Может быть, даже «лучшая практика»?
Мне не нужно оценивать какой-либо JavaScript, хотя он, скорее всего, встроен в HTML-страницы.Мне также не нужно использовать CSS для стилизации, хотя он интенсивно используется на рассматриваемых HTML-страницах.Мне просто нужно извлечь определенные блоки HTML (в виде строк таблицы) на основе их идентификатора или класса CSS.
PS: я готов использовать только существующие библиотеки синтаксического анализа HTML C ++ на случай, если все возможные и рациональные попытки с использованием чистогоQt fail.
PPS: Просто ради того, чтобы видеть и знать их, я также хотел бы найти необычные решения.; -)
Вот часть моего текущего кода, где я анализирую и удаляю определенные части HTML-страницы, используя QWebElement
.reportPage
является QWebPage
объектом.
reportPage->document().findFirst( "table[id=gadgettable]" ).findFirst( "tr[class=c2]" ).takeFromDocument();
reportPage->mainFrame()->documentElement().findFirst( "table[id=gadgettable]" ).findFirst( "tr" ).takeFromDocument();
reportPage->mainFrame()->documentElement().findFirst( "table[id=gadgettable]" ).findFirst( "td[id=gadgettable-left-td]" ).takeFromDocument();
reportPage->mainFrame()->documentElement().findFirst( "table[id=gadgettable]" ).findFirst( "td[id=gadgettable-right-td]" ).takeFromDocument();
reportPage->mainFrame()->documentElement().findFirst( "table[id=gadgettable]" ).findFirst( "tr" ).nextSibling().takeFromDocument();
reportPage->mainFrame()->documentElement().findFirst( "table[id=gadgettable]" ).findFirst( "tr" ).nextSibling().takeFromDocument();