に読み込まれたWebページの生のHTMLコンテンツを読み取ることはできUIWebView
ますか?
そうでない場合、iPhone SDKのWebページから未加工のHTMLコンテンツをプルする別の方法(.NETに相当するものなどWebClient::openRead
)はありますか?
に読み込まれたWebページの生のHTMLコンテンツを読み取ることはできUIWebView
ますか?
そうでない場合、iPhone SDKのWebページから未加工のHTMLコンテンツをプルする別の方法(.NETに相当するものなどWebClient::openRead
)はありますか?
回答:
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
はあいまいであり、ドキュメントはそれについてあまり述べていません)。
詳細:
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
私にとって、これまで何度も命の恩人でした。できる限りドキュメントから戻るようです。
既にロードされているUIWebViewのコンテンツを抽出する場合は、-stringByEvaluatingJavaScriptFromString。例えば:
NSString *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
NSString stringWithContentsOfURLは、同じリクエストを行うUIWebViewとはまったく異なるユーザーエージェント文字列を報告することに注意してください。したがって、サーバーがユーザーエージェントを認識していて、誰が要求しているかに応じて異なるHTMLを送り返す場合、この方法では正しい結果が得られない可能性があります。
また、@"document.body.innerHTML"
上記はbodyタグの内容のみを表示することに注意してください。使用@"document.all[0].innerHTML"
すると頭と体の両方が得られます。!doctypeまたはhtmlタグが返されないため、UIWebViewの完全なコンテンツではありませんが、かなり近いです。
(Xcode 5 iOS 7)iOS 7およびXcode 5のユニバーサルアプリの例です。これは、次の場所にあるオープンソースプロジェクト/例です:SimpleWebViewへのリンク(プロジェクトのZipとソースコードの例)
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
}