C++ と Qt を学習するという純粋な目的のために、ローカル ディレクトリから HTML ファイル (数百まで) を読み取り、それらを変更して、別のローカル ディレクトリに書き戻す小さな Qt ベースのプログラムを作成しています。
私の最初の試みは、 がQWebPage
提供する HTML 解析機能を使用することでしたQWebElement
。ただし、メモリリークが原因で深刻な問題が発生しますQWebPage
(これは、正しい方法で使用していないことが原因である可能性が非常に高いですが、これは別のトピックであり、この質問の一部ではありません)。
今のところ、私は GUI を使用していません。後で使用するつもりですが、プログラムのこの部分は決して GUI の一部ではなく、バックグラウンドのどこかにあります。したがって、より軽量に見えるby
の使用法を置き換えることを考えました。しかし、Qt-API には の解析関数に似た関数が見つかりませんでした。これまでのところ、私のコードは に依存しており、最後に.QWebPage
QTextBrowser
QWebElement
QWebElement::findFirst()
QWebElement::nextSibling()
QWebElement::takeFromDocument()
QTextBrowser
では、 HTML パーサーとして実装 (または使用) する可能性はほとんどないのでしょうか? たぶん「ベストプラクティス」でさえありますか?
JavaScript は HTML ページにインライン化されている可能性が非常に高いですが、評価する必要はありません。CSS は問題の HTML ページで頻繁に使用されていますが、スタイリングに CSS を使用する必要もありません。ID または CSS クラスに基づいて特定の HTML ブロックを (表の行として) 取得する必要があるだけです。
PS: 純粋な Qt を使用した実行可能で合理的な試みがすべて失敗した場合に備えて、現在の C++ HTML 解析ライブラリを使用したいと考えています。
PPS: それらを見て知るためだけに、私はまた、並外れた解決策にたどり着きたいと思います. ;-)
これが現在のコードの一部で、.html を使用して 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();