68

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

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

4

9 に答える 9

89

乱雑な HTML を解析するには、 hppleを使用すると非常に便利であることがわかりました。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 ライブラリ コードに基づいて独自の軽量ソリューションをコーディングすることをお勧めします。

于 2009-10-24T15:30:40.633 に答える
49

libxml2.2SDK に付属しているように見えlibxml/HTMLparser.h、次のように主張しています。

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

それは私が必要としているもののように聞こえるので、おそらくそれを使用するつもりです.

于 2009-01-02T05:35:05.613 に答える
19

誰かが素敵な XPath パーサーをグーグル検索してここにたどり着き、TFHpple を使用した場合に備えて、TFHpple は XPathQuery を使用することに注意してください。これはかなり良いですが、メモリ リークがあります。

関数 *PerformXPathQuery では、ノードが nil であることが判明した場合、クリーンアップする前に飛び出します。

このコードが表示されている場所: 2 つのクリーンアップ行を追加します。

  xmlNodeSetPtr nodes = xpathObj->nodesetval;
  if (!nodes)
    {
      NSLog(@"Nodes was nil.");
        /* Cleanup */
        xmlXPathFreeObject(xpathObj);
        xmlXPathFreeContext(xpathCtx);
      return nil;
    }

大量の解析を行っている場合、それは悪質なリークです。さて...どうすれば私の夜を取り戻すことができますか:-)

于 2011-03-09T12:57:59.603 に答える
12

私は便利かもしれないlibxmlの軽量ラッパーを書きました:

Objective-C-HMTL-パーサー

于 2010-05-10T21:18:07.673 に答える
5

これはおそらく、HTML がどれだけ乱雑で、何を抽出したいかによって異なります。しかし通常、Tidyは非常にうまく機能します。これは C で書かれており、iPhone 用にビルドして静的にリンクできるはずです。コマンド ライン バージョンを簡単にインストールして、最初に結果をテストできます。

于 2009-01-02T02:14:19.417 に答える
4

Webkitコンポーネント、そしておそらくこれらのようなタスクのためのjqueryなどのサードパーティパッケージを使用するのはどうですか?非表示のコンポーネントでhtmlデータをフェッチし、javascriptフレームワークの非常に成熟したセレクターを利用することは可能ではないでしょうか。

于 2011-01-27T11:39:41.073 に答える
3

Convertigoを使用してサーバー側でHTMLを解析し、クリーンでクリーンなJSONWebサービスをモバイルアプリに返します

于 2012-01-12T18:18:50.457 に答える
3

Google の GData Objective-C API は、Apple が iPhone SDK から削除した NSXMLElement およびその他の関連クラスを再実装します。ここで見つけることができますhttp://code.google.com/p/gdata-objectivec-client/。Jabber 経由でメッセージを処理するために使用しました。もちろん、HTML の形式が正しくない (終了タグがない) 場合、これはあまり役に立ちません。

于 2009-01-02T06:09:22.173 に答える