web-dev-qa-db-ja.com

UIWebViewからHTMLコンテンツを読み取る

UIWebViewにロードされたWebページの生のHTMLコンテンツを読むことは可能ですか?

そうでない場合、iPhone SDKのWebページから生のHTMLコンテンツを取得する別の方法はありますか(.NET WebClient::openReadに相当するものなど)?

130

2番目の質問は実際に答える方が簡単です。 NSStringの stringWithContentsOfURL:encoding:error: メソッドを見てください-NSURLのインスタンスとしてURLを渡すことができ(NSStringから簡単にインスタンス化できます)、そのURLのページの完全なコンテンツを含む文字列を返します。例えば:

NSString *googleString = @"http://www.google.com";
NSURL *googleURL = [NSURL URLWithString:googleString];
NSError *error;
NSString *googlePage = [NSString stringWithContentsOfURL:googleURL 
                                                encoding:NSASCIIStringEncoding
                                                   error:&error];

このコードの実行後、googlePageにはwww.google.comのHTMLが含まれ、errorにはフェッチで発生したエラーが含まれます。 (フェッチ後にerrorの内容を確認する必要があります。)

(UIWebViewから)別の方法で行うのは少し複雑ですが、基本的には同じ概念です。ビューから request をプルしてから、以前と同じようにフェッチする必要があります。

NSURL *requestURL = [[yourWebView request] URL];
NSError *error;
NSString *page = [NSString stringWithContentsOfURL:requestURL 
                                          encoding:NSASCIIStringEncoding
                                             error:&error];

EDIT:これらのメソッドは両方ともリクエストを2回実行するため、パフォーマンスが低下します。これを回避するには、そのstringByEvaluatingJavascriptFromString:メソッドを使用して、現在ロードされているUIWebViewからコンテンツを取得します。

NSString *html = [yourWebView stringByEvaluatingJavaScriptFromString: 
                                         @"document.body.innerHTML"];

これにより、ドキュメントオブジェクトモデルを使用してビューの現在のHTMLコンテンツを取得し、JavaScriptを解析して、HTMLのNSString *として提供します。

別の方法は、最初にプログラムでリクエストを実行してから、リクエストしたものからUIWebViewをロードすることです。 NSString *pageの呼び出しの結果としてstringWithContentsOfURL:encoding:error:を持っている上記の2番目の例を取り上げるとしましょう。その後、loadHTMLString:baseURL:を使用して、その文字列をWebビューにプッシュできます(要求したNSURLを保持している場合)。

[yourWebView loadHTMLString:page baseURL:requestURL];

ただし、これがロードするページで見つかったJavaScriptを実行するかどうかはわかりません(メソッド名loadHTMLStringはやや曖昧であり、ドキュメントではあまり説明していません)。

詳細については:

214
Tim

すでにロードされているUIWebViewのコンテンツを抽出する場合は、-stringByEvaluatingJavaScriptFromString。例えば:

NSString  *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
91
Ben Gottlieb

HTMLの生データ全体を取得するには(<head>および<body>を使用):

NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
43
tuoxie007

NSString stringWithContentsOfURLは、同じリクエストを行うUIWebViewとはまったく異なるユーザーエージェント文字列を報告することに注意してください。そのため、サーバーがユーザーエージェントに対応しており、要求元に応じて異なるHTMLを送信する場合、この方法では正しい結果が得られない可能性があります。

また、上記の@"document.body.innerHTML"はbodyタグの内容のみを表示することに注意してください。 @"document.all[0].innerHTML"を使用すると、頭と体の両方を取得できます。これは、!doctypeまたはhtmlタグを取得しないため、UIWebViewの完全なコンテンツではありませんが、かなり近いです。

29
Pmatt

読むには:-

NSString *html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent"];
NSLog(html);    

変更するには:-

html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent=''"];
19
Agni

Swift v3の場合:

let doc = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
2
Mc.Lover

これを試してください:

document.documentElement.outerHTML
1
schumyxp

次のようなSwift拡張を使用します。

extension UIWebView {
    var htmlContent:String? {
        return self.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
    }

}
1
Nathan

(Xcode 5 iOS 7)iOS 7およびXcode 5のユニバーサルアプリの例これは、次の場所にあるオープンソースプロジェクト/例です: SimpleWebViewへのリンク(プロジェクトのZipおよびソースコードの例)

1

もう一つの例

let content = uiWebView.stringByEvaluatingJavaScript(from: "document.body.innerHTML")

WKWebViewからHTMLを取得
HTMLをUIWebViewに挿入
HTMLをWKWebViewに挿入

0
yoAlex5