답변:
두 번째 질문은 실제로 대답하기가 더 쉽습니다. stringWithContentsOfURL:encoding:error:
NSString 의 방법을 살펴보십시오. NSString (NSString에서 쉽게 인스턴스화 할 수 있음)의 인스턴스로 URL을 전달하고 해당 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];
편집 :이 두 가지 방법은 요청을 두 번 수행하므로 성능이 저하됩니다. 다음 stringByEvaluatingJavascriptFromString:
과 같이 메소드를 사용하여 현재로드 된 UIWebView에서 컨텐츠를 가져 와서이 문제를 해결할 수 있습니다 .
NSString *html = [yourWebView stringByEvaluatingJavaScriptFromString:
@"document.body.innerHTML"];
그러면 Document Object Model을 사용하여 뷰의 현재 HTML 컨텐츠를 가져와 JavaScript를 구문 분석 한 다음 HTML의 NSString *로 제공합니다.
다른 방법은 프로그래밍 방식으로 요청을 먼저 수행 한 다음 요청한 내용에서 UIWebView를로드하는 것입니다. NSString *page
에 대한 호출의 결과 인 위의 두 번째 예를 가정 해 보겠습니다 stringWithContentsOfURL:encoding:error:
. 그런 다음 loadHTMLString:baseURL:
요청한 NSURL을 유지한다고 가정하고을 사용하여 해당 문자열을 웹보기로 푸시 할 수 있습니다 .
[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 링크 (프로젝트 우편 및 소스 코드 예)
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
}