誰でもHTML解析にCまたはObjective-Cライブラリを推奨できますか?完全に検証されない厄介なHTMLコードを処理する必要があります。
そのようなライブラリは存在しますか、それとも正規表現を使用しようとする方が良いでしょうか?
libxml2.2
はSDKに含まれ、libxml/HTMLparser.h
は以下を主張します。
このモジュールは、XMLパーサーと互換性のあるAPIを備えたHTML 4.0非検証パーサーを実装します。仕様の観点からひどく壊れている場合でも、「実世界」のHTMLを解析できる必要があります。
それは私が必要なもののように聞こえるので、おそらくそれを使用するつもりです。
hpple を使用すると、乱雑なHTMLを解析するのに非常に便利です。 Hppleプロジェクトは、HTMLを解析するためのXPathQueryライブラリのObjective-Cラッパーです。これを使用して、XPathクエリを送信し、結果を受信できます。
要件:
-プロジェクトにlibxml2インクルードを追加します
-プロジェクトにlibxml2ライブラリを追加します
-From hpple 以下のソースコードファイルを取得し、プロジェクトに追加します。
- w3school XPath Tutorial を見て、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ライブラリコードに基づいて独自の軽量ソリューションをコーディングすることをお勧めします。
誰かがニース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の周りに軽量のラッパーを書きました:
ElementParserをチェックアウトすることをお勧めします。 HTMLとXMLの「十分な」解析を提供します。優れたインターフェイスにより、XML/HTMLドキュメントを簡単に確認できます。 http://touchtank.wordpress.com/
これはおそらく、HTMLがどれだけ乱雑で、何を抽出したいかによって異なります。しかし、通常 Tidy は非常に良い仕事をします。 Cで書かれており、iPhone用にビルドして静的にリンクできるはずです。コマンドラインバージョンを簡単にインストールし、最初に結果をテストできます。
Webkitコンポーネント、およびこれらのようなタスクにjqueryなどのサードパーティパッケージを使用するのはどうですか?非表示のコンポーネントでhtmlデータを取得し、javascriptフレームワークの非常に成熟したセレクターを利用することはできませんか?
GoogleのGData Objective-C APIは、NSXMLElementおよびその他の関連クラスを再実装します。AppleはiPhone SDKから削除されました。ここで見つけることができます http://code.google.com/p/ gdata-objectivec-client / 。Jabberを介したメッセージングの処理に使用しましたが、もちろんHTMLの形式が正しくない(終了タグがない)場合、これはあまり役に立ちません。
Convertigoを使用してサーバー側でHTMLを解析し、クリーンで洗練されたJSON Webサービスをモバイルアプリに返します