C++とQtを学ぶという目的のために、ローカルディレクトリからHTMLファイル(数百まで)を読み込み、変更して別のローカルディレクトリに書き戻すQtベースの小さなプログラムを書いています。QWebPageの代わりにバックグラウンドでHTMLページを解析して変更するのにQTextBrowserを使用する価値はありますか?
私の最初の試みは、QWebPage
と、QWebElement
が提供するHTML解析機能を使用していました。しかし、私はメモリリークのいくつかの重大な問題に遭遇するQWebPage
(これは正しい方法を使用して私の不足が原因で非常に可能性が高いですが、これは別のトピックであり、この質問の一部ではありません)。
これまでのところ、私はGUIを使用していないし、後でそれを行うつもりだが、私のプログラムのこの部分は決してGUIの一部ではなく、バックグラウンドのどこかにある。
したがって、私はQWebPage
の使用をQTextBrowser
に置き換えましたが、これはより軽量に見えます。しかし、Qt-APIの関数は、構文解析関数QWebElement
に似ています。これまでのところ、私のコードはQWebElement::findFirst()
,QWebElement::nextSibling()
そして最後にQWebElement::takeFromDocument()
に依存しています。
したがって、QTextBrowser
をHTMLパーサーとして実装(または使用)する可能性はほとんどありませんか?たぶん「ベストプラクティス」ですか?
JavaScriptを評価する必要はありませんが、HTMLページにインライン展開されている可能性があります。また、CSSをスタイリングに使用する必要はありませんが、HTMLページで頻繁に使用されています。私は、idやCSSクラスに基づいて特定のHTMLブロック(テーブル行など)を取得するだけです。
PS:純粋なQtを使用するすべての実行可能かつ合理的な試みが失敗した場合、現在のC++ HTML解析ライブラリを使用したいと思います。
PPS:これを見て知るために、私は今も驚くべき解決策を得たいと思っています。 ;-)
は、ここで私が解析し、QWebElement
を使用してHTMLページの特定の部分を削除し、私の現在のコードの一部です。 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();
私はちょうどQDomDocumentを使ってみました。それは本当に軽量です。しかし、私が有効なXHTMLとして扱っているHTMLファイルは、各ファイルのかなりの部分が無視されています。 XPath/XQueryがこれを処理できるかどうかはわかりません。さもなければ、私はRegExに落ちなければならないと思います。 –