Стоит ли использовать QTextBrowser для анализа и изменения HTML-страницы в фоновом режиме вместо QWebPage? - PullRequest
1 голос
/ 20 декабря 2011

В целях изучения 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();

1 Ответ

2 голосов
/ 20 декабря 2011

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

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

...