Стоит ли использовать QTextBrowser для анализа и изменения HTML-страницы в фоновом режиме вместо QWebPage?

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

person Torbjörn    schedule 19.12.2011    source источник


Ответы (1)


QTextBrowser не предназначен для редактирования, которое вы предлагаете. Однако, основываясь на вашем описании, код QDomDocument/QDomElement может работать для вас - в зависимости от того, достаточно ли совместимы ваши входные документы с XML, чтобы их можно было принять и снова записать классами DOM. (В частности, этот подход может привести к потере форматирования элементов)

Также в основном коде DOM отсутствует расширенная поддержка запросов — вам нужно либо вручную искать в DOM атрибуты id, либо использовать более продвинутую поддержку XPath/XQuery.

person James Turner    schedule 19.12.2011
comment
Я только что попытался использовать QDomDocument. Он действительно легкий. Но поскольку HTML-файлы, которые я обрабатываю, далеко не являются допустимым XHTML, значительная часть каждого файла игнорируется. Я не знаю, справится ли с этим XPath/XQuery. В противном случае, я думаю, мне придется вернуться к RegEx. - person Torbjörn; 23.12.2011