質問

誰でもHTML解析にCまたはObjective-Cライブラリを推奨できますか?完全に検証されない乱雑なHTMLコードを処理する必要があります。

そのようなライブラリは存在しますか、それとも正規表現を使用しようとする方が良いですか?

役に立ちましたか?

解決 2

libxml2.2 のような外観はSDKに含まれており、 libxml / HTMLparser.h は次のように主張しています:

  

このモジュールは、XMLパーサーと互換性のあるAPIを備えたHTML 4.0非検証パーサーを実装します。 「実世界」を解析できるはずです。 HTML、仕様の観点からひどく壊れている場合でも。

それは私が必要なもののように聞こえるので、おそらくそれを使うつもりです。

他のヒント

hpple を使用すると、乱雑なHTMLの解析に非常に便利です。 Hppleプロジェクトは、HTMLを解析するためのXPathQueryライブラリのObjective-Cラッパーです。これを使用して、XPathクエリを送信し、結果を受信できます。

要件

-libxml2インクルードをプロジェクトに追加

  1. メニュープロジェクト->プロジェクト設定の編集
  2. 設定の検索"ヘッダー検索パス"
  3. 新しい検索パスを追加" $ {SDKROOT} / usr / include / libxml2"
  4. 再帰オプションを有効にする

-libxml2ライブラリをプロジェクトに追加

  1. メニュープロジェクト->プロジェクト設定の編集
  2. 他のリンカーフラグの設定を検索する
  3. 新しい検索フラグ" -lxml2"を追加します

- hpple から次のソースコードファイルを取得し、プロジェクトに追加します。

  1. TFpple.h
  2. TFpple.m
  3. TFppleElement.h
  4. TFppleElement.m
  5. XPathQuery.h
  6. XPathQuery.m

- 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ライブラリコードに基づいて独自の軽量ソリューションをコーディングすることをお勧めします。

いい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の周りに軽量のラッパーを書きました:

Objective-C-HMTL-Parser

これはおそらく、HTMLの乱雑さと抽出したいものに依存します。ただし、通常は Tidy は非常に良い仕事をします。 Cで書かれており、iPhone用にビルドして静的にリンクできるはずです。コマンドラインバージョンを簡単にインストールし、最初に結果をテストできます。

ElementParserをチェックアウトできます。それは「ちょうど十分」を提供します; HTMLおよびXMLの解析。優れたインターフェイスにより、XML / HTMLドキュメントを簡単に確認できます。 http://touchtank.wordpress.com/

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サービスをモバイルアプリに返します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top