С чистой целью изучения 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 потерпят неудачу.
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();