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


132

に読み込まれたWebページの生のHTMLコンテンツを読み取ることはできUIWebViewますか?

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

回答:


216

2番目の質問の方が答えが簡単です。stringWithContentsOfURL:encoding:error:NSString のメソッドを見てください。URLをNSURLのインスタンスとして渡すことができ(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から)逆方向に進むのは少し難しいですが、基本的には同じ概念です。ビューからリクエストをプルして、以前のようにフェッチを行う必要があります。

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

編集:これらのメソッドは両方ともリクエストを2回実行するため、パフォーマンスに影響を与えます。次のstringByEvaluatingJavascriptFromString:ように、メソッドを使用して現在ロードされているUIWebViewからコンテンツを取得することで、これを回避できます。

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

これにより、Document Object Modelを使用してビューの現在のHTMLコンテンツが取得され、JavaScriptが解析されて、HTMLのNSString *として渡されます。

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

[yourWebView loadHTMLString:page baseURL:requestURL];

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

詳細:


1
驚くばかり!素晴らしい答えをありがとう。どちらの方法でもページが2回読み込まれることになり、パフォーマンスに影響する可能性があります。それを回避する方法はありますか?
ファジーパープルモンキー

2
実際のところ、:)編集済みの回答があります。
ティム

1
はい、[yourWebView loadHTMLString:page baseURL:requestURL]; ページでJavascriptを実行します。私はこのAPIをGoogleマップで使用しました。
jeff7091 2009年

3
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];私にとって、これまで何度も命の恩人でした。できる限りドキュメントから戻るようです。
ennalax

2
@Hanumanこれはあなたに役立つかもしれません:NSString * head = [yourWebView stringByEvaluatingJavaScriptFromString:@ "document.head.innerHTML"]; NSString * body = [yourWebView stringByEvaluatingJavaScriptFromString:@ "document.body.innerHTML"]; NSString * totalPage =両方の文字列を追加します。
ディープチャヤン

91

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

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

10
くそー、それは賢い!
jemmons

2
私が持っている質問は、コンテンツがJSON文字列である場合、またはbodyタグのない未加工の文字列である場合はどうなりますか?
stephenmuss

これは健全な解決策ではありません!すべてのJavaScriptコードとヘッダー情報はこの方法で失われます。
Radu Simionescu

43

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

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

29

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

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


理論的には、サーバーからリクエストすることでdoctypeを取得できます。Doctypeはuseragentに基づいて変更されない可能性があります。
Moshe

20

読むには:-

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

変更するには:-

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

2

Swift v3の場合:

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


1

私はこのような迅速な拡張機能を使用します:

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

}

1

あなたはこれを試す必要があります:

document.documentElement.outerHTML

1

UIWebView

UIWebViewからHTMLを取得 `

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

HTMLをUIWebViewに設定する

//Do not forget to extend a class from `UIWebViewDelegate` and nil the delegate

func someFunction() {

    let uiWebView = UIWebView()
    uiWebView.loadHTMLString("<html><body></body></html>", baseURL: nil)
    uiWebView.delegate = self as? UIWebViewDelegate
}

func webViewDidFinishLoad(_ webView: UIWebView) {
    //ready to be processed
}

[WKWebViewからHTMLを取得/設定]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.