UIWebView
にロードされたWebページの生のHTMLコンテンツを読むことは可能ですか?
そうでない場合、iPhone SDKのWebページから生のHTMLコンテンツを取得する別の方法はありますか(.NET WebClient::openRead
に相当するものなど)?
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
はやや曖昧であり、ドキュメントではあまり説明していません)。
詳細については:
すでにロードされているUIWebViewのコンテンツを抽出する場合は、-stringByEvaluatingJavaScriptFromString。例えば:
NSString *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
HTMLの生データ全体を取得するには(<head>
および<body>
を使用):
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
NSString stringWithContentsOfURLは、同じリクエストを行うUIWebViewとはまったく異なるユーザーエージェント文字列を報告することに注意してください。そのため、サーバーがユーザーエージェントに対応しており、要求元に応じて異なるHTMLを送信する場合、この方法では正しい結果が得られない可能性があります。
また、上記の@"document.body.innerHTML"
はbodyタグの内容のみを表示することに注意してください。 @"document.all[0].innerHTML"
を使用すると、頭と体の両方を取得できます。これは、!doctypeまたはhtmlタグを取得しないため、UIWebViewの完全なコンテンツではありませんが、かなり近いです。
読むには:-
NSString *html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent"];
NSLog(html);
変更するには:-
html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent=''"];
Swift v3の場合:
let doc = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
これを試してください:
document.documentElement.outerHTML
次のようなSwift拡張を使用します。
extension UIWebView {
var htmlContent:String? {
return self.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
}
}
(Xcode 5 iOS 7)iOS 7およびXcode 5のユニバーサルアプリの例これは、次の場所にあるオープンソースプロジェクト/例です: SimpleWebViewへのリンク(プロジェクトのZipおよびソースコードの例)
もう一つの例
let content = uiWebView.stringByEvaluatingJavaScript(from: "document.body.innerHTML")