web-dev-qa-db-ja.com

iPhoneでHTMLを解析する

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

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

68
Sophie Alpert

libxml2.2はSDKに含まれ、libxml/HTMLparser.hは以下を主張します。

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

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

49
Sophie Alpert

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

要件

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

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

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

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

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

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

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

90
Albaregar

誰かがニースXPathパーサーを探してここに来て、TFHppleを使用しなくなった場合に備えて、TFHppleはXPathQueryを使用していることに注意してください。これはかなり良いですが、メモリリークがあります。

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

したがって、次のコードを参照してください:2つのクリーンアップ行を追加します。

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

大量の解析を行っている場合、それは悪質なリークです。今....どのように私は私の夜を取り戻すのですか:-)

20
DavidAWalsh

役に立つかもしれないlibxmlの周りに軽量のラッパーを書きました:

Objective-C-HMTL-Parser

12
Ben Reeves

ElementParserをチェックアウトすることをお勧めします。 HTMLとXMLの「十分な」解析を提供します。優れたインターフェイスにより、XML/HTMLドキュメントを簡単に確認できます。 http://touchtank.wordpress.com/

5
Lee

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

5
tcurdt

Webkitコンポーネント、およびこれらのようなタスクにjqueryなどのサードパーティパッケージを使用するのはどうですか?非表示のコンポーネントでhtmlデータを取得し、javascriptフレームワークの非常に成熟したセレクターを利用することはできませんか?

4
tore

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

3
dnolen

Convertigoを使用してサーバー側でHTMLを解析し、クリーンで洗練されたJSON Webサービスをモバイルアプリに返します

3
Wulkanman