HTML解析にCまたはObjective-Cライブラリを推奨できる人はいますか?完全に検証されない厄介なHTMLコードを処理する必要があります。
そのようなライブラリは存在しますか、それとも正規表現を使用しようとする方がよいでしょうか?
HTML解析にCまたはObjective-Cライブラリを推奨できる人はいますか?完全に検証されない厄介なHTMLコードを処理する必要があります。
そのようなライブラリは存在しますか、それとも正規表現を使用しようとする方がよいでしょうか?
乱雑な HTML を解析するには、 hppleを使用すると非常に便利であることがわかりました。Hpple プロジェクトは、HTML を解析するための XPathQuery ライブラリの Objective-C ラッパーです。これを使用して、XPath クエリを送信し、結果を受け取ることができます。
要件:
- libxml2 インクルードをプロジェクトに追加します
- libxml2 ライブラリをプロジェクトに追加します
-hppleから次のソース コード ファイルを取得し、プロジェクトに追加します。
- w3school XPath チュートリアルを散歩して、XPath 言語に慣れてください。
コード例
#import "TFHpple.h"
NSData *data = [[NSData alloc] initWithContentsOfFile:@"example.html"];
// Create parser
xpathParser = [[TFHpple alloc] initWithHTMLData:data];
//Get all the cells of the 2nd row of the 3rd table
NSArray *elements = [xpathParser searchWithXPathQuery:@"//table[3]/tr[2]/td"];
// Access the first cell
TFHppleElement *element = [elements objectAtIndex:0];
// Get the text within the cell tag
NSString *content = [element content];
[xpathParser release];
[data release];
既知の問題点
hpple は別のラッパーである XPathQuery のラッパーであるため、このオプションはおそらく最も効率的ではありません。プロジェクトでパフォーマンスが問題になる場合は、hpple および xpathquery ライブラリ コードに基づいて独自の軽量ソリューションをコーディングすることをお勧めします。
libxml2.2
SDK に付属しているように見えlibxml/HTMLparser.h
、次のように主張しています。
このモジュールは、XML パーサーと互換性のある API を備えた HTML 4.0 非検証パーサーを実装します。仕様の観点からはひどく壊れていても、「現実世界」の HTML を解析できるはずです。
それは私が必要としているもののように聞こえるので、おそらくそれを使用するつもりです.
誰かが素敵な XPath パーサーをグーグル検索してここにたどり着き、TFHpple を使用した場合に備えて、TFHpple は XPathQuery を使用することに注意してください。これはかなり良いですが、メモリ リークがあります。
関数 *PerformXPathQuery では、ノードが nil であることが判明した場合、クリーンアップする前に飛び出します。
このコードが表示されている場所: 2 つのクリーンアップ行を追加します。
xmlNodeSetPtr nodes = xpathObj->nodesetval;
if (!nodes)
{
NSLog(@"Nodes was nil.");
/* Cleanup */
xmlXPathFreeObject(xpathObj);
xmlXPathFreeContext(xpathCtx);
return nil;
}
大量の解析を行っている場合、それは悪質なリークです。さて...どうすれば私の夜を取り戻すことができますか:-)
私は便利かもしれないlibxmlの軽量ラッパーを書きました:
これはおそらく、HTML がどれだけ乱雑で、何を抽出したいかによって異なります。しかし通常、Tidyは非常にうまく機能します。これは C で書かれており、iPhone 用にビルドして静的にリンクできるはずです。コマンド ライン バージョンを簡単にインストールして、最初に結果をテストできます。
Webkitコンポーネント、そしておそらくこれらのようなタスクのためのjqueryなどのサードパーティパッケージを使用するのはどうですか?非表示のコンポーネントでhtmlデータをフェッチし、javascriptフレームワークの非常に成熟したセレクターを利用することは可能ではないでしょうか。
Convertigoを使用してサーバー側でHTMLを解析し、クリーンでクリーンなJSONWebサービスをモバイルアプリに返します
Google の GData Objective-C API は、Apple が iPhone SDK から削除した NSXMLElement およびその他の関連クラスを再実装します。ここで見つけることができますhttp://code.google.com/p/gdata-objectivec-client/。Jabber 経由でメッセージを処理するために使用しました。もちろん、HTML の形式が正しくない (終了タグがない) 場合、これはあまり役に立ちません。